2009-02-09 55 views
14

我有一個整數向量,我想將它轉換成一個向量對(由bool和int組成)。我目前的代碼是這樣簡單:使用變換創建一個新的向量

std::vector<int> a; 
    std::vector<std::pair<bool,int> > b; 

    a.push_back(1); 
    a.push_back(2); 
    a.push_back(3); 

    for(int i = 0; i < a.size(); ++i) 
    { 
     b.push_back(std::make_pair(false, a[i])); 
    } 

有沒有什麼辦法可以做到這一點,而無需自己編寫循環?可能使用一些算法?

回答

15

你可以做一個仿函數和std::for_each

struct F { 
    F(std::vector<std::pair<bool,int> > &b) : m_b(b){ 
    } 

    void operator()(int x) { 
     m_b.push_back(std::make_pair(false, x)); 
    } 

    std::vector<std::pair<bool,int> > &m_b; 
}; 

std::for_each(a.begin(), a.end(), F(b)); 

雖然這可能被證明是更多的麻煩比它的價值。但至少它會是可重用的:)。

也許有些事情可以用boost::bind完成。

2.編輯:我想你可能可以使用後退插入器和變換的綁定。是這樣的:

std::transform(a.begin(), a.end(), std::back_inserter(b), boost::bind(std::make_pair<bool, int>, false, _1)); 

我試圖與std::bind1st,我認爲它應該有工作,但我只能得到它與boost::bind成功。我會繼續努力......

編輯:這裏是一個非升壓解決方案:

std::transform(a.begin(), a.end(), std::back_inserter(b), std::bind1st(std::ptr_fun(std::make_pair<bool, int>), false)); 

4.編輯:這裏是一個C++ 11的解決方案(這是我現在的最喜歡的):

std::for_each(begin(a), end(a), [&b](int v) { 
    b.push_back(std::make_pair(false, v)); 
}); 

或更簡單:

for(int v : a) { 
    b.push_back(std::make_pair(false, v)); 
} 
+1

釷anks..I希望有比這更簡單的方法..還可以編輯答案,以便傳遞給構造函數的參數不是一個常量引用。我沒有使用boost,所以我使用標準的STL算法。 – Naveen 2009-02-09 05:34:08