我一直试图找出如何在地图中插入值的向量。例如:
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main()
{
map <int, vector<int> > mymap;
mymap.insert(pair<int, vector<int> > (10, #put something here#));
return 0;
}
我不知道使用什么语法插入向量的值。我试过了{1,2}
,但那次失败了。我应该使用什么语法?
如果我提前声明了一个矢量并给它起了一个名字,那么一切都有效,但我不想这样做,因为我想要一张有很多矢量的地图。
提前感谢
答案 0 :(得分:15)
如果你想要一个空的矢量,你可以这样做:
mymap.insert(pair<int,vector<int> >(10, vector<int>()));
然后你可以用以下内容添加你想要的任何元素:
mymap[10].push_back(1);
mymap[10].push_back(2);
编辑:删除了错误的断言,即如果/当地图增长时,将复制向量。正如评论者指出的那样,对于std :: map来说,情况并非如此,它是基于节点的。
答案 1 :(得分:8)
基本上,您的问题不是将std::vector
插入std::map
。您的问题是如何轻松创建具有任意初始元素值的匿名 std::vector
。
在ISO C ++ 03中,你不能。但是C++11 allows using initialization lists for this。
如果你遇到C ++ 03编译器,你可能会创建一个辅助函数来返回一个带有指定元素的向量:
std::vector<int> make_vector(int a, int b)
{
std::vector<int> v;
v.push_back(a);
v.push_back(b);
return v;
}
如果您要插入的矢量具有不同的大小,则可以使用可变参数函数,但这样做会要求您传递元素数量或具有保留的sentinel值。
答案 2 :(得分:6)
如果您使用的是C ++ 11,则可以使用vector的初始化列表constructor(该列表中的最后一个构造函数),如下所示:
mymap.insert(pair<int, vector<int> > (10, {1, 2, 3}));
如果只能使用C ++ 03,vector
有一个构造函数,它为每个可能足够的元素获取大小和默认值。否则,您将必须构造向量然后插入它。如果你想在插入时避免使用矢量的不合理副本,你可以像swap
那样:
vector<int> myvec;
myvec.push_back(1);
myvec.push_back(2);
mymap[10].swap(myvec);
这样就不需要复制矢量了。您将获得额外的矢量默认构造,但这并不是非常昂贵。
答案 3 :(得分:2)
#put something here#
= vector<int>{1,2}
虽然{1,2}
没有用,但我很惊讶。你没有使用C ++ 11编译器吗?如果没有那么你只能在那里创建带有默认构造函数的向量(没有值),或者先用值填充它并将其粘贴在其中。
答案 4 :(得分:1)
这应该适用于C ++ 2003编译器。
#include <iostream>
#include <vector>
#include <map>
#include <cassert>
using namespace std;
std::vector<int> make_vector(int a, int b) {
std::vector<int> result;
result.push_back(a);
result.push_back(b);
return result;
}
int main()
{
map <int, vector<int> > mymap;
mymap.insert(make_pair(10, make_vector(1,2)));
// Or, alternatively:
// mymap[10] = make_vector(1,2);
assert(mymap[10][0] == 1);
assert(mymap[10][1] == 2);
return 0;
}
答案 5 :(得分:1)
C ++ 03没有初始化列表,初始化集合可能很难。
如果无法升级到更现代版本的编译器,则可以始终使用Boost.Assignment
库。它具有list_of
功能。
#put something here# -> boost::assign::list_of(1)(2)