C++ c++;std将列表复制到映射

C++ c++;std将列表复制到映射,c++,stl,stdstring,stdmap,C++,Stl,Stdstring,Stdmap,考虑以下几点: struct A { int i; double d; std::string s; }; std::list<A> list_A; 结构A { int i; 双d; std::字符串s; }; std::列表A; 我想将list_A的所有元素复制到一个映射中,这样映射中的每一对元素都将由list_A中的一个元素作为值和它的字符串s作为键组成。有没有比在列表中循环并插入每个元素及其字符串作为映射键更优雅的方法?对不起,上次回答得太快了,

考虑以下几点:

struct A
{
    int i;
    double d;
    std::string s;
};

std::list<A> list_A; 
结构A { int i; 双d; std::字符串s; }; std::列表A;
我想将list_A的所有元素复制到一个映射中,这样映射中的每一对元素都将由list_A中的一个元素作为值和它的字符串
s
作为键组成。有没有比在列表中循环并插入每个元素及其字符串作为映射键更优雅的方法?

对不起,上次回答得太快了,没有详细说明,下面是一个可编译的代码

struct A
{
    int i;
    double d;
    std::string s;
};

std::list<A> list_A;

std::pair<std::string, A> convert(const A &x) {
    return make_pair(x.s,x);
}

int main() {

    std::map<std::string,A> out;

    std::transform(list_A.begin(), list_A.end(), std::inserter(out,out.end()),convert);

}
结构A { int i; 双d; std::字符串s; }; std::列表A; 标准::对转换(常数A和x){ 返回make_对(x.s,x); } int main(){ 标准::制定计划; std::transform(list_A.begin(),list_A.end(),std::inserter(out,out.end()),convert); }
这应该会让您了解如何使用
转换

std::pair<std::string, A> pairify(const A& a) { return std::make_pair(a.s, a); }

std::transform(list.begin(), list.end(), std::inserter(map, map.end()), pairify);
std::pairify(const A&A){return std::make_pair(A.s,A);}
std::transform(list.begin()、list.end()、std::inserter(map、map.end())、pairify);
最重要的是:

insert interator是一种特殊类型的输出迭代器,它允许通常覆盖元素(如copy)的算法在容器中的特定位置自动插入新元素


我可以将其存储在
集合中
:这样地图本身就不会有数据重复:

结构A { 布尔运算符<(常数A&r_)常数{return(s
我可以保持循环:通过这种方式,您可以正确地处理重复的元素。

如果您使用C++11,您可以将lambda函数与捕获一起使用:

std::map<std::string, A> m;
std::list<A> l;
std::for_each(l.begin(), l.end(),
              [&](const A& a) {
                  m.insert(std::make_pair(a.s, a));
              });
std::map m;
std::列表l;
std::for_each(l.begin(),l.end(),
[&](常数A&A){
m、 插入(标准:制作成对(a.s,a));
});

我喜欢标准的库算法和lambda,但它没有比以下简单多少:

for (const A& value : list_A) {
    map_A.insert(std::make_pair(value.s, value));
}

其他方法与此代码等效,此循环可读性好,速度也一样快。

对于我来说,循环是最好的可读性和最受支持的解决方案。您可以使用。您可以使用标准的
For
基于范围的For
循环。如果使用标准库算法,则将编写相同的循环体,并将其打包到函数对象或lambda中以传递给算法。就我个人而言,对于这样简单的事情,我认为基于
范围的
循环“更好”。。。首先,map需要两个模板参数,其次,您不能初始化map使其具有相同的列表大小;你不能像这样“分配”一个映射迭代器。。。你说得对,我只是第一次给出大纲,没有所有的细节。我知道我没有问效率,但我很好奇:这种方法比循环所有元素并将它们插入地图更有效吗?
for (const A& value : list_A) {
    map_A.insert(std::make_pair(value.s, value));
}