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

时间:2013-09-05 20:25:48

标签: c++ stl stdstring stdmap

请考虑以下事项:

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

std::list<A> list_A; 

我想将list_A的所有元素复制到地图中,以便地图中的每一对都包含list_A中的元素作为值,其字符串s作为键。有没有办法比循环遍历列表更优雅,并将每个元素及其字符串作为地图的键插入?

5 个答案:

答案 0 :(得分:6)

这可以让您了解如何使用transform

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

reason to use the inserter是:

  

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

答案 1 :(得分:4)

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

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

其他方法正在执行此代码的等效操作,并且此循环可读且同样快。

答案 2 :(得分:1)

很抱歉上次没有回复太快,没有详细信息,这是一个可编辑的代码。

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

}

答案 3 :(得分:0)

我可以将它存储在set中:这样地图中就不存在数据重复(s本身):

struct A
{
    bool operator < (const A& r_) const { return (s < r_.s); }
    int i;
    double d;
    std::string s;
};

std::list<A> list_A;
std::set<A> set_A;

for ( std::list<A>::const_iterator itr = list_A.begin(); itr != list_A.end(); ++itr ) {
    if ( ! set_A.insert(*itr).second ) {
      // Handle duplicated elements
    }
}

我可以保持循环:通过这种方式,您可以正确处理重复的元素。

答案 4 :(得分:0)

如果您使用C ++ 11,则可以将lambda函数与capture:

一起使用
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));
              });