英文:
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<int> src = {1, 2, 3};
std::vector<int> 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 < 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<int> dst(9);
和所示的代码会导致无限循环。
std::vector<int> dst;
for (int i = 0; i < 3; ++i)
dst.insert(dst.end(), src.begin(), src.end());
英文:
You have an error in the question. With std::vector<int> dst(9);
and the shown code you get an infinit loop.
std::vector<int> dst;
for (int i = 0; i < 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<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()]; } );
}
答案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<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);
}
答案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
src
,take
其中 3 个,join
视图,转换为 vector
。
英文:
One way is to use range-v3
library, example:
#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>Demo</kbd>
i.e repeat
src
, take
3 of them, join
the views
, convert to vector
答案5
得分: 0
你可以使用<algorithm>
中的std::copy_n
函数。
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> src = {1, 2, 3};
std::vector<int> dst(9);
const size_t times = dst.size() / src.size();
for (int i = 0; i < times; i++)
{
std::copy_n(src.begin(), src.size(), dst.begin() + i * src.size());
}
for (int x : dst) std::cout << x << ' ';
}
英文:
You can use std::copy_n
from <algorithm>
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> src = {1, 2, 3};
std::vector<int> dst(9);
const size_t times = dst.size() / src.size();
for (int i = 0; i < times; i++)
{
std::copy_n(src.begin(), src.size(), dst.begin() + i * src.size());
}
for (int x : dst) std::cout << x << ' ';
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论