2012-07-13 89 views
1

我怎樣纔能有效地修改使用STL算法這兩個列表的元素:如何修改不同類型列表中的元素?

std::list<std::pair<double, string> > listPair(10); 
std::list<double> listA(10); 

並以這樣的方式使得第一對元素會從listA的相應的雙值?

+0

你爲什麼做兩個列表?更有效地使用std :: map。 否則,我沒有其他的選擇,但採取兩個迭代器,並作出一個簡單的循環 – Bentoy13 2012-07-13 10:31:48

+0

我必須使用兩個列表。其實,這是一個(非常)細分的例子。 – tmaric 2012-07-13 11:24:48

回答

3

在這裏,我假設listPair已經填滿,因爲沒有辦法讓該字符串,否則。


您可以直接循環訪問集合。

auto a_cur = listA.begin(), a_end = listA.end(); 
auto pair_cur = listPair.begin(); 
for (; a_cur != a_end; ++ a_cur, ++ pair_cur) { 
    pair_cur->first = *a_cur; 
} 

或使用std::transform的「二進制」的版本,但是這將涉及到複製的字符串:

std::transform(listA.begin(), listA.end(), listPair.begin(), listPair.begin(), 
       [](double a, std::pair<double, string> b) { 
        return std::make_pair(a, b.second); 
       }); 
+0

我想使用第一個塊的代碼;但我想過使用stl算法,因爲它減少了我侵入的代碼量,並且使其他人更容易閱讀。每當我嘗試使用stl算法時,它們(以及它們所調用的函數對象)似乎都非常依賴複製數據,這在我的情況下使代碼不那麼高效。 – tmaric 2012-07-13 11:26:37

3

嘗試使用C++ 11 lambda表達式

#include <algorithm> 
#include <list> 
#include <string> 
#include <utility> 

int main() 
{ 
    std::list<std::pair<double, std::string> > listPair(10); 
    std::list<double> listA(10); 

    // original question: assign double of listA to listPair 
    std::transform(
     listA.begin(), listA.end(), listPair.begin(), listPair.begin(), 
     [](double d, std::pair<double, std::string> const& p) { 
      return std::make_pair(d, p.second); 
     } 
    ); 

    // other way around: assign double from listPair to listA 
    std::transform(
     listPair.begin(), listPair.end(), back_inserter(listA), 
     [](std::pair<double, std::string> const& p) { 
      return p.first; 
     } 
    ); 

    return 0; 
} 
+0

我認爲問題是要求以其他方式來做......即使用'listA'填充'listPair',也不應該像'inserter'這樣的迭代器適配器,因爲目標列表將是空的。 – Naveen 2012-07-13 10:35:47

+0

@Naveen你說得對,會糾正它。 – TemplateRex 2012-07-13 10:39:57

+0

哎呀..我對我的評論的第二部分錯了。在'listA'中已經構建了'10'個默認對象。 – Naveen 2012-07-13 10:41:17