以重复的方式将元素添加到 std::vector
Adding elements to std::vector in a repeated way
我想将值从一个向量复制到另一个向量,这些向量将以特定顺序存储,第二个向量将包含比第一个向量更多的元素。
例如:
vector<int> temp;
temp.push_back(2);
temp.push_back(0);
temp.push_back(1);
int size1 = temp.size();
int size2 = 4;
vector<int> temp2(size1 * size2);
现在我想像这样填充 temp2:{2, 2
, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1}。是否可以仅使用算法(例如填充)来做到这一点?
是的,可以使用std::generate_n
算法:
int main() {
std::vector<int> base{1, 0, 2};
const int factor = 4;
std::vector<int> out{};
std::generate_n(std::back_inserter(out), base.size() * factor,
[&base, counter=0]() mutable {
return base[counter++ / factor];
});
for(const auto i : out) {
std::cout << i << ' ';
}
}
此代码打印:1 1 1 1 0 0 0 0 2 2 2 2
关键是 std::generate_n
中使用的 lambda . 它在内部计数器上运行,以根据base
向量(并根据factor
和counter
值访问)来生成哪些值。
不,这是一个非常具体的用例,但您可以自己轻松实现它。
#include <vector>
#include <iostream>
std::vector<int> Elongate(const std::vector<int>& src, const size_t factor)
{
std::vector<int> result;
result.reserve(src.size() * factor);
for (const auto& el : src)
result.insert(result.end(), factor, el);
return result;
}
int main()
{
std::vector<int> temp{2, 0, 1};
std::vector<int> real = Elongate(temp, 4);
for (const auto& el : real)
std::cerr << el << ' ';
std::cerr << 'n';
}
(现场演示)
相关文章:
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用std::transform将一个范围的元素添加到另一个范围中
- 是否将std::packaged_task添加到现有线程
- 使用 std::transform 将向量向量 (a) 添加到另一个向量向量 (b)
- 为什么"std::add_pointer"会添加之前删除的"const"?
- 在迭代期间添加到 std::unordered_set(或 unordered_map)中的元素是否会在迭代期间访问?
- 有什么理由不扩展 std::set 以添加下标运算符吗?
- std 不包含,但它应该添加库
- 向 std::list 添加新元素的复杂性
- 将元素添加到 std::list 在多线程中,无需 C++ 互斥锁
- 我可以在"std"命名空间中添加推理指南吗?
- c++17在编译时将带有已删除复制构造函数的类添加到std::vector
- 如何将全局std::map添加到chaiscript
- "stoi"没有在此范围内声明,即使添加 -std=c++0x 和自定义函数,仍然适用
- 优化编译器可以添加std::move吗
- C++自定义模板LinkedList在添加std::string时崩溃
- 添加std::string定义会导致访问冲突
- C++没有添加"std::vector<std::string>"作为"main()"的参数"overload"的原因是什么?
- 如何为我的模板类添加std::swap
- 在 qt 中添加 += -std=c++11 QMAKE_CXXFLAGS 到 .pro 文件中不起作用(在 Linux