如何在C++中使用一个较小的向量填充另一个向量?

huangapple go评论73阅读模式
英文:

How can I fill a vector with another smaller vector in c++?

问题

我想用另一个向量来填充`std::vector`。例如:

```c++
std::vector<int> src = {1, 2, 3};
std::vector<int> dst(9);

我想填充dst,使其变为:1, 2, 3, 1, 2, 3, 1, 2, 3

有没有一种高效的方法可以做到这一点?

我现在有两种方法:

第一种是使用两个循环:

auto size = dst.size() / src.size();
for (int i = 0; i < size; i++) {
    for (int val : src) {
        dst.emplace_back(val);
    }
}

或者在一个循环中使用std::copy

也许存在一种更高效的方法?


<details>
<summary>英文:</summary>

I want to fill a `std::vector` with another `vector` . For example:

``` c++
std::vector&lt;int&gt; src = {1, 2, 3};
std::vector&lt;int&gt; dst(9);

I want to fill dst to make it become: 1, 2, 3, 1, 2, 3, 1, 2, 3

Is there an efficient method to do this?

I have two methods now:

The first is two loop:

auto size = dst.size() / src.size();
for (int i = 0; i &lt; size; i++) {
    for (int val : src) {
        dst.emplace_back(val);
    }
}

Or use the std::copy in one loop.

Maybe exist a more efficient method?

答案1

得分: 1

在问题中存在错误。使用std::vector&lt;int&gt; dst(9);和所示的代码会导致无限循环。

std::vector::insert

std::vector&lt;int&gt; dst;
for (int i = 0; i &lt; 3; ++i)
    dst.insert(dst.end(), src.begin(), src.end());
英文:

You have an error in the question. With std::vector&lt;int&gt; dst(9); and the shown code you get an infinit loop.

std::vector::insert

std::vector&lt;int&gt; dst;
for (int i = 0; i &lt; 3; ++i)
    dst.insert(dst.end(), src.begin(), src.end());

答案2

得分: 1

每次计算余数可能效率低下...?
(但是,dst 的大小不必是 src 的大小的倍数。)

std::vector<int> src = {1, 2, 3};
std::vector<int> dst(9);
{
    int i = 0;
    std::generate(dst.begin(), dst.end(), [&i, &src]()->int { return src[(i++) % src.size()]; });
}
英文:

Computing the remainder each time may be inefficient...?
(But, size of dst does not have to be a multiple of the size of src.)

std::vector&lt;int&gt; src = {1, 2, 3};
std::vector&lt;int&gt; dst(9);
{
	int i=0;
	std::generate( dst.begin(), dst.end(), [&amp;i,&amp;src]()-&gt;int{	return src[(i++)%src.size()];	} );
}

答案3

得分: 1

这个版本使用迭代器而不是索引,以下是翻译的代码部分:

std::vector<int> src = {1, 2, 3};
std::vector<int> dst(9);

for (auto i = dst.begin(), e = dst.end(); i != e;)
{
    i = std::copy_n(src.begin(),
           std::min(src.size(), std::size_t(e - i)), i);
}
英文:

How about this version that uses iterators instead of indices:

std::vector&lt;int&gt; src = {1, 2, 3};
std::vector&lt;int&gt; dst(9);

for (auto i = dst.begin(), e = dst.end(); i != e;)
{
    i = std::copy_n(src.begin(),
           std::min(src.size(), std::size_t(e - i)), i);
}

答案4

得分: 1

一种方法是使用 range-v3 库,示例:

#include <range/v3/all.hpp>
#include <vector>

int main()
{
  using namespace ranges;
  std::vector<int> src = {1, 2, 3};
  std::vector<int> dst =
      views::repeat(src) | views::take(3) | views::join | to<std::vector>();
}

[kbd] 演示 [/kbd]

repeat srctake 其中 3 个,join 视图,转换为 vector

英文:

One way is to use range-v3 library, example:

#include &lt;range/v3/all.hpp&gt;
#include &lt;vector&gt;

int main()
{
  using namespace ranges;
  std::vector&lt;int&gt; src = {1, 2, 3};
  std::vector&lt;int&gt; dst =
      views::repeat(src) | views::take(3) | views::join | to&lt;std::vector&gt;();
}

<kbd>Demo</kbd>

i.e repeat src, take 3 of them, join the views, convert to vector

答案5

得分: 0

你可以使用&lt;algorithm&gt;中的std::copy_n函数。

#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;

int main()
{
    std::vector&lt;int&gt; src = {1, 2, 3};
    std::vector&lt;int&gt; dst(9);

    const size_t times = dst.size() / src.size();
    for (int i = 0; i &lt; times; i++)
    {
        std::copy_n(src.begin(), src.size(), dst.begin() + i * src.size());
    }

    for (int x : dst) std::cout &lt;&lt; x &lt;&lt; ' ';
}
英文:

You can use std::copy_n from &lt;algorithm&gt;

#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;

int main()
{
    std::vector&lt;int&gt; src = {1, 2, 3};
    std::vector&lt;int&gt; dst(9);

    const size_t times = dst.size() / src.size();
    for (int i = 0; i &lt; times; i++)
    {
        std::copy_n(src.begin(), src.size(), dst.begin() + i * src.size());
    }

    for (int x : dst) std::cout &lt;&lt; x &lt;&lt; &#39; &#39;;
}

huangapple
  • 本文由 发表于 2023年3月1日 14:33:17
  • 转载请务必保留本文链接:https://go.coder-hub.com/75600257.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定