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

How to modify elements in lists of different types?

本文关键字:列表 同类型 元素 何修改 修改      更新时间:2023-10-16

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

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

以这样的方式,第一对元素从listA中获得相应的双值?

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

尝试使用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;
 }