如何使用算法将一种类型的列表映射到现代 C++ 中的另一种类型的列表

Posted

技术标签:

【中文标题】如何使用算法将一种类型的列表映射到现代 C++ 中的另一种类型的列表【英文标题】:How to map a list of one type to a list of another type in modern c++ using algorithms 【发布时间】:2021-08-14 05:49:35 【问题描述】:

似乎每个人都同意您需要避免使用原始循环,例如

for (...)

   ...

同样适用于while...

我正在寻找一种最佳方式来完成从std::list<type_a>std::list<type_b> 的映射并遵循这种做法。我的第一个猜测是我需要使用标准算法。我希望是这样的:

std::list<type_a> list_a= ...;
std::list<type_b> list_b= some_algorithms<type_b>(list_a);

我应该选择什么以及最终的解决方案会是什么样子? 我努力尽可能地提供最优雅、最高效的解决方案。

【问题讨论】:

std::transform + std::back_inserter? 【参考方案1】:

是的,std::transform 也可以做到这一点。

// convert list function
template<typename to_type, typename from_type>
std::list<to_type> convert_list(const std::list<from_type>& from_list)

    std::list<to_type> to_list from_list.size() ;
    std::transform(from_list.cbegin(), from_list.cend(), to_list.begin(), [](const from_type& value)  return convert<to_type>(value); );
    return to_list;

【讨论】:

你觉得在这里使用 std::back_inserter 怎么样?什么更好 - 提前保留新列表或在旅途中构建它? 这完全取决于std::list的实际实现。我的直觉是预分配,因为我们可以确定在向列表中添加新项目时它不必在内部增长(重新分配内存)。【参考方案2】:

我认为任何解决方案都会有某种循环(即使它隐藏在某些标准库算法中)。

我接了你的电话 std::list list_b= some_algorithms(list_a); 作为基础,想出了这个。

#include <stdlib.h>
#include <list>
#include <string>

// in general converting items is just typecasting them
template<typename to_type, typename from_type>
to_type convert(const from_type& value)

    return static_cast<to_type>(value);


// add specializations for conversion when needed, in this case int to std::string
template<>
std::string convert(const int& value)

    return std::to_string(value);


// convert list function
template<typename to_type, typename from_type>
std::list<to_type> convert_list(const std::list<from_type>& from_list)

    std::list<to_type> to_list;

    for (const auto& value : from_list)
    
        to_list.push_back(convert<to_type>(value));
    

    return to_list;


int main()

    std::list<int> values 0,1,42 ;
    auto string_values = convert_list<std::string>(values);

【讨论】:

根据@Evg 评论,std::transform 是已经以某种方式实现了您的convert_list 的STL 函数。你的(它是正确的,至少我无法发现其中的任何错误)它与cppreference 建议的 std::transform 的“可能实现”非常相似。很可能,STL 的人确实正确地实现了它,考虑到所有的极端情况,高效且更好,然后我可以编写它:让我们充分利用他们的工作 @GianPaolo 看起来我必须更详细地查找转换;)

以上是关于如何使用算法将一种类型的列表映射到现代 C++ 中的另一种类型的列表的主要内容,如果未能解决你的问题,请参考以下文章

我如何将一次出现的所有项目过滤到一个列表中,并将多次出现的所有项目过滤到另一个列表中?

将一种类型的 STL 对象存储到另一种类型的有效方法

使用 swig 类型映射从 c++ 方法返回向量<pair<int,int>> & 到 python 元组列表

2021年大数据常用语言Scala(二十二):函数式编程 映射 map

将一组值映射到百分比

如何使用 C++ 模板实现从类型到对象方法调用的映射?