2016-04-07 99 views
1

我有一個函數需要兩個整數向量。第一個向量作爲引用傳遞,第二個向量作爲const的引用。我想同時遍歷兩個向量,並更新第一個向量。因此,像下面:同時在ref/cref範圍上迭代

#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; 
} 

我快到的問題是遍歷兩個區域,其中一個是裁判,另一個是裁判常量。如何正確使用boost:combine/for循環?謝謝。

+1

爲什麼你標記您的問題,您的代碼會工作的C++ 11和使用boost元組和foreach? – Chiel

+0

爲什麼你將第二個作爲const引用傳遞? – Chiel

+0

第三,你可以把一個我們可以真正編譯和運行的代碼嗎?或者在最壞的情況下,我們可以編輯以便編譯? – Chiel

回答

1

您沒有充分利用C++ 11的類型推導。另外,當迭代整數時,通過引用訪問它們是毫無意義的。

你的代碼沒有編譯的原因有兩方面:1.你不能用引用默認構造一個元組,2.當你有一個const引用時你不能改變它的值。無論如何,boost::tuple<int&, int const&> x;是不必要的。

#include <iostream> 
#include <vector> 
#include <boost/range/combine.hpp> 

void foo(std::vector<int>& a, std::vector<int> const& b) 
{ 
    for(auto x : boost::combine(a,b)) 
     x.get<0>() += x.get<1>() + 5; 
} 

int main() 
{ 
    std::vector<int> a(3,10); 
    std::vector<int> b(3,10); 
    foo(a,b); 
    for (auto v : a) 
     std::cout << v << std::endl; 
} 

當然,你真的應該使用std::transform,但這表明,如果只有你更多的槓桿C++ 11位:)

+0

謝謝你的時間。它現在有道理。我同意我不會在int中使用它。實際的代碼使用更復雜的結構,但我只是簡化了問題陳述以使用ints向量。 – user4979733

5

至少如果我正確地讀了Boost的東西,你似乎想類似的東西:

std::transform(a.begin(), a.end(), 
       b.begin(), 
       a.begin(), 
       [] (int x, int y) { return x + y + 5; }); 

目前的情況是,這個使用C++ 11。如果你需要它沒有C++ 11,你無疑可以使用boost拉姆達來完成同樣的事情,或者你可以寫一個函數對象自己:

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()); 
} 

還要注意的是std::vector<int>& const b不正確。你幾乎肯定打算有:std::vector<int> const &b。在,&之後的const,它表示參考本身是const。之前移動它意味着參考文獻指的是const。前者是沒有意義的(你不能將const應用於引用;在const引用的概念有任何意義的範圍內,每個引用總是const)。