【问题标题】:Insert std::map into std::vector directly将 std::map 直接插入 std::vector
【发布时间】:2019-05-07 00:38:45
【问题描述】:

对不起,如果这个问题很琐碎。

我有一个地图向量:

typedef map<char, int> edges;
typedef vector<edges> nodes;

nodes n;

现在假设我想推动一个玩具边缘。我尝试了不同的东西,我的工作是

edges e;        //declare an edge
e['c'] = 1;     //initialize it
n.push_back(e);  //push it to the vector

我怎样才能只推送边的一对值('c' 和 2),而不必声明变量并对其进行初始化?

类似:

n.push_back(edges('c',2));

但是编译器报错

error: no matching function for call to ‘std::map<char, int>::map(char, int)’

【问题讨论】:

标签: c++ c++11 vector stdvector stdmap


【解决方案1】:

可以列出初始化:

nodes vec {
    { {'a', 12}, {'b', 32} },
    { {'c', 77} },
};

vec.push_back(
        { {'d', 88}, {'e', 99} }
        );

【讨论】:

  • 您能详细说明一下吗?我不想用一些边来初始化向量,我只想在循环中能够将边推送到向量而无需声明边,只需传递两个值。
  • @SembeiNorimaki push_back 是一样的
  • @SembeiNorimaki 您不能将边缘推到向量,因为您没有边缘向量。你可以用一条边推送地图。
  • @SembeiNorimaki std::map 有一个带有std::initializer_list 类型参数的构造函数。由于std::vector::push_back 在这里有一个std::map 类型的参数,所以使用了那个构造函数(这就是emplace_back 不起作用的原因)。
【解决方案2】:

使用扩展的初始化列表,像这样:

n.push_back({ {'c', 2} });

Live demo

需要 C++11 或更高版本。

【讨论】:

    【解决方案3】:

    在您的解决方案中,您将 map 添加到向量而不是对。一个方法应该遍历每个元素以将其放置在向量中。因此,您可以使用n[0]['c'] 等访问元素。

    我想,使用 for_each 和带有传递向量引用的 lambda 表达式来创建一个单行解决方案,将对添加到向量中。

    #include <algorithm> 
    
    typedef map<char, int> edges;
    //change this to take pair
    typedef vector<pair<char, int>> nodes;
    
    nodes n;
    edges e;        //declare an edge
    
    //map elements are pairs
    for_each(e.begin(), e.end(), [&n](pair<char, int> p) { n.push_back(p); });
    

    我希望这为您解释了一个解决方案。

    【讨论】:

      猜你喜欢
      • 2019-08-19
      • 1970-01-01
      • 2013-08-18
      • 2018-05-31
      • 1970-01-01
      • 2023-03-07
      • 2016-02-04
      • 2010-09-10
      • 1970-01-01
      相关资源
      最近更新 更多