C++ 无输出的变换
我有两个大小相同的向量。我需要用另一个向量的内容修改一个向量的每个元素。是否有一种标准算法可以在不返回原始向量的情况下实现这一点 假设我想通过向量条的对应元素修改向量foo的所有元素。我可以使用transform: 但是把任务交给foo是不必要的。或者,我可以编写自己的函数:C++ 无输出的变换,c++,loops,vector,transform,stl-algorithm,C++,Loops,Vector,Transform,Stl Algorithm,我有两个大小相同的向量。我需要用另一个向量的内容修改一个向量的每个元素。是否有一种标准算法可以在不返回原始向量的情况下实现这一点 假设我想通过向量条的对应元素修改向量foo的所有元素。我可以使用transform: 但是把任务交给foo是不必要的。或者,我可以编写自己的函数: auto a = foo.begin(); auto b = bar.begin(); while(a != foo.end()){ (a++)->func(*(b++)); } 但是,如果已经有了一些东
auto a = foo.begin();
auto b = bar.begin();
while(a != foo.end()){
(a++)->func(*(b++));
}
但是,如果已经有了一些东西,我宁愿不要重新发明轮子。你要求的基本上是二进制函数的一个。 由于还没有这样的事情,您可以执行以下操作之一: 1为二进制函数的每一个实现这样一个for_的通用版本: 代码取自
你所要求的基本上是一个二进制函数。 由于还没有这样的事情,您可以执行以下操作之一: 1为二进制函数的每一个实现这样一个for_的通用版本: 代码取自
对此最清晰的答案似乎是使用索引而不是迭代器
for(auto i = 0; i < foo.size(); ++i) foo[i].func(bar[i]);
对此最清晰的答案似乎是使用索引而不是迭代器
for(auto i = 0; i < foo.size(); ++i) foo[i].func(bar[i]);
小型实用程序功能模板:
template <typename Input1, typename Input2, typename BinaryOperation>
void zip(Input1 b1, Input1 e1, Input2 b2, BinaryOperation binOp) {
while (b1 != e1) binOp(*b1++, *b2++);
}
小型实用程序功能模板:
template <typename Input1, typename Input2, typename BinaryOperation>
void zip(Input1 b1, Input1 e1, Input2 b2, BinaryOperation binOp) {
while (b1 != e1) binOp(*b1++, *b2++);
}
您是不想存储操作的结果,还是想将其存储在其他向量中?@blasko我不想存储结果。我想要一个没有输出迭代器且忽略lambda返回的转换函数。您不想存储操作结果,还是想将其存储在其他向量中?@blasko我不想存储结果。我想要一个没有输出迭代器且不考虑lambda返回的转换函数。你说还没有这样的事情,我应该对即将到来的事情抱有希望吗?@JonathanMee链接的std提案是从2013年开始的,我认为这不会在任何时候出现。我最终花时间阅读了整个线程。看起来它从来没有比有人在论坛上发表评论更进一步,这将是一个很好的论坛。正如线程中提到的,boost::zip_迭代器在不久的将来也不会在标准中占有一席之地。当我想到vectors时,似乎没有什么动机将任何东西放在标准中:你说还没有这样的东西,我是否应该对即将出现的东西抱有希望?@JonathanMee链接的std提案是从2013年开始的,我不认为这会在任何时候出现,因为我终于花时间通读了整条线索。看起来它从来没有比有人在论坛上发表评论更进一步,这将是一个很好的论坛。正如线程中提到的,boost::zip_迭代器在不久的将来也不会在标准中占有一席之地。当我想到向量时,似乎很少有动机将任何东西放在标准中:
for(auto i = 0; i < foo.size(); ++i) foo[i].func(bar[i], baz[i], buz[i]);
template <typename Input1, typename Input2, typename BinaryOperation>
void zip(Input1 b1, Input1 e1, Input2 b2, BinaryOperation binOp) {
while (b1 != e1) binOp(*b1++, *b2++);
}
zip(begin(foo), end(foo), begin(bar), [](auto& a, const auto& b){ a.func(b); });