我有一个带两个整数向量的函数.第一个向量作为引用传递,第二个向量作为const的引用传递.我想同时迭代两个向量,并更新第一个向量.如下所示:
#include <iostream>
#include <vector>
#include <boost/foreach.hpp>
#include <boost/range/combine.hpp>
void foo(std::vector<int>& a, std::vector<int> const& b)
{
boost::tuple<int&, int const&> x;
BOOST_FOREACH(x, boost::combine(a,b)) {
int& v1 = x.get<0>();
int const& v2 = x.get<1>();
v1 = v1 + v2 + 5;
}
}
int main(int argc, char **argv)
{
std::vector<int> a(3,10);
std::vector<int> b(3,10);
foo(a,b);
for (int v : a) {
std::cout << v << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是迭代两个范围,其中一个是ref,另一个是ref const.如何正确使用boost:combine/for循环?谢谢.
至少如果我正确地阅读Boost内容,你似乎想要类似于:
std::transform(a.begin(), a.end(),
b.begin(),
a.begin(),
[] (int x, int y) { return x + y + 5; });
Run Code Online (Sandbox Code Playgroud)
就目前而言,这使用C++ 11.如果你需要它而没有C++ 11,你无疑可以使用Boost Lambda来完成同样的事情,或者你可以自己编写一个函数对象:
struct combine {
int operator()(int x, int y) { return x + y + 5; }
};
void foo(std::vector<int>& a, std::vector<int> const & b)
{
std::transform(a.begin(), a.end(),
b.begin(),
a.begin(),
combine());
}
Run Code Online (Sandbox Code Playgroud)
另请注意,这std::vector<int>& const b是不正确的.你几乎肯定打算:std::vector<int> const &b相反.随着const 之后的&,它说的是,参考自身const.之前移动它意味着参考引用的是const.前者没有意义(你不能应用于const引用;在const引用的概念完全有意义的范围内,每个引用总是const).