2012-07-13 39 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