如何修改不同类型列表中的元素?

Posted

技术标签:

【中文标题】如何修改不同类型列表中的元素?【英文标题】:How to modify elements in lists of different types? 【发布时间】:2012-07-13 10:24:10 【问题描述】:

如何使用 stl 算法有效地修改这两个列表的元素:

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

并且以这样的方式,第一个对元素从listA中获取相应的双精度值?

【问题讨论】:

为什么要列出两个列表?更有效地使用 std::map。否则,我没有其他选择,只能使用两个迭代器并制作一个简单的 for 循环 我必须使用两个列表。实际上,这是一个(非常)细分的例子。 【参考方案1】:

这里我假设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);
               );

【讨论】:

我想使用第一块的代码;但我考虑过使用 stl 算法,因为它减少了我破解的代码量,并且让其他人更容易阅读。每当我尝试使用 stl 算法时,似乎它们(以及它们调用的函数对象)确实在很大程度上依赖于复制数据,在我的情况下,这使得代码效率不高。【参考方案2】:

尝试使用 C++11 lambdas

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

【讨论】:

我认为问题在于以其他方式进行操作。即使用listA 填充listPair,您也不应该使用诸如inserter 之类的迭代器适配器,因为目标列表将为空。 糟糕.. 我的评论的第二部分是错误的。 10 默认对象已在 listA 中构造。 我正在开发一个尚未使用 C++11 的大型库。无论如何,谢谢+竖起大拇指。 :) @tomislav-maric 还有 Boost.Lambda,如果你可以使用的话。 @tomislav-maric:只需定义一个函数/结构实例,然后引用它。 lambda 只是它的语法糖。例如,请参阅***.com/questions/6408881/…。

以上是关于如何修改不同类型列表中的元素?的主要内容,如果未能解决你的问题,请参考以下文章

python基本数据类型之列表和元组

Python数据类型

复合数据类型,英文词频统计

复合数据类型,英文词频统计

如何将不同类型的子元素反序列化为基类型的列表/集合,这是相应类的属性

Python中的元组(Tuple)