25

我一直在试图弄清楚如何为地图中的值插入向量。例如:

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

如果我提前声明一个向量并给它一个名字,一切都会奏效,但我不想这样做,因为我想要一张包含很多向量的地图。

先感谢您

4

6 回答 6

28

如果你想要一个空向量,你可以这样做:

mymap.insert(pair<int,vector<int> >(10, vector<int>()));

然后,您可以添加您想要的任何元素,例如:

mymap[10].push_back(1);
mymap[10].push_back(2);

编辑:删除了如果/当地图增长时将复制向量的错误断言。正如评论者所指出的,这不适用于基于节点的 std::map。

于 2012-05-07T19:32:54.907 回答
12

基本上你的问题不是关于std::vector插入std::map. 您的问题是如何轻松创建具有任意初始元素值的匿名对象。 std::vector

在 ISO C++03 中,你不能。 但是, C++11 允许对此使用初始化列表

如果你被 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;
}

如果您插入的向量大小不同,则可以使用可变参数函数,尽管这样做需要您传递元素的数量或具有保留的标记值。

于 2012-05-07T19:31:45.767 回答
8

如果您使用的是 C++11,则可以使用向量的初始化列表构造函数(该列表中的最后一个构造函数),如下所示:

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

这样就不需要复制向量了。你会得到一个额外的向量默认构造,但这不是很贵。

于 2012-05-07T19:34:46.090 回答
4

#put something here#=vector<int>{1,2}

我很惊讶,尽管那{1,2}没有用。你没有使用 C++11 编译器吗?如果不是,那么您只能在此处使用默认构造函数创建向量(无值),或者先用值填充它并将其插入。

于 2012-05-07T19:27:31.653 回答
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;
}
于 2012-05-07T19:44:18.503 回答
1

C++03 没有初始化列表,初始化集合可能会很痛苦。

如果您无法升级到更现代的编译器版本,您可以随时使用该Boost.Assignment库。它有一个list_of功能正是为此。

#put something here# -> boost::assign::list_of(1)(2)
于 2012-05-07T19:52:26.870 回答