直接将std::map插入到std::vector中

3

如果问题太过琐碎,请见谅。

我有一个由多个映射组成的向量:

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? - Daniel Langr
是的,但如果其他标准的解决方案不同,为了完整起见,如果您也能提供差异,我将不胜感激,谢谢。 - user2261062
1
可能是emplace_back not working with std::vector<std::map<int, int>>的重复问题。 - Daniel Langr
3个回答

4
您可以列出初始化:

您可以列出初始化:

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

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

你能详细说明一下吗?我不想用一些边来初始化向量,我只想在循环内部能够将边推入向量中,而不必声明一个边,只需传递两个值即可。 - user2261062
1
@SembeiNorimaki push_back 是相同的。 - llllllllll
5
@SembeiNorimaki,你不能将边推入向量,因为你没有一条边的向量。但是你可以将一个包含一条边的映射推入。 - bolov
@SembeiNorimaki std::map有一个以std::initializer_list类型为参数的构造函数。由于在此处std::vector :: push_back具有std::map类型的参数,因此使用该构造函数(这就是为什么emplace_back不起作用的原因)。 - Daniel Langr

3

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

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

演示

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


0
在您的解决方案中,您将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); });

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接