在ref/cref范围内同时迭代

use*_*733 1 c++ boost c++11

我有一个带两个整数向量的函数.第一个向量作为引用传递,第二个向量作为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循环?谢谢.

Jer*_*fin 5

至少如果我正确地阅读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).