在C ++中在map中插入value的值

时间:2012-05-07 19:25:10

标签: c++

我一直试图找出如何在地图中插入值的向量。例如:

#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},但那次失败了。我应该使用什么语法?

如果我提前声明了一个矢量并给它起了一个名字,那么一切都有效,但我不想这样做,因为我想要一张有很多矢量的地图。

提前感谢

6 个答案:

答案 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)