STL中的矢量地图?

时间:2009-09-04 17:34:45

标签: c++ stl

我想要一个矢量图,(但我不想使用指针作为内部矢量),是否可能?

// define my map of vector
map<int, vector<MyClass> > map;

// insert an empty vector for key 10. # Compile Error
map.insert(pair<int, vector<MyClass> >(10, vector<MyClass>)); 

我知道如果我已经使用指针进行向量,如下,那就没问题,但我想知道我是否可以避免使用指针并使用上面的数据结构(我不想手动删除)

// define my map of vector
map<int, vector<MyClass>* > map;

// insert an empty vector for key 10.
map.insert(pair<int, vector<MyClass>* >(10, new vector<MyClass>)); 

9 个答案:

答案 0 :(得分:30)

第一个数据结构将起作用。您可能需要typedef部分代码,以便将来的工作更轻松:

typedef std::vector<MyClass>      MyClassSet;
typedef std::map<int, MyClassSet> MyClassSetMap;

MyClassSetMap map;
map.insert(MyClassSetMap::value_type(10, MyClassSet()));

或(感谢quamrana):

map[10] = MyClassSet();

答案 1 :(得分:17)

是的,但你的第二行应该是:

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

这将插入一个由整数10和空向量组成的对。两者都将被复制,如果您正在处理大型向量,那么您将需要小心复制。

另外:using namespace std时不要调用变量“map”。你在吓我; - )

答案 2 :(得分:6)

使用fbrereton中的typedef你也可以这样做:

typedef std::vector<MyClass>      MyClassSet;
typedef std::map<int, MyClassSet> MyClassSetMap;

MyClassSetMap map;
map[10]=MyClassSet();

您可以使用operator[]代替insert().这样可以节省线路噪音。

答案 3 :(得分:6)

使用交换功能有效地添加矢量。

map<int, vector<SomeClass> > Map;

vector<SomeClass> vec;
//...add elements to vec

Map[1] = vector<int>();
// swap the empty vector just inserted with your vector.
Map[1].swap(vec); 

答案 4 :(得分:4)

您应该阅读编译错误消息。他们通常会为您提供所需的所有信息。
您的代码在该字符串中显示错误'illegal use of this type as an expression'。这意味着您使用的是类型,而不是对象。要使用对象,只需添加()即可调用没有参数的构造函数。

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

顺便说一句,您可以使用std :: make_pair来创建对。它推导出参数类型,因此无需明确指出它们。

map.insert( make_pair( 10, vector<MyClass>() ) );

答案 5 :(得分:3)

您可以使用[]运算符 这些会将值插入到地图中。

map[10]; // create the 10 element if it does not exist
         // using the default constructor.

如果您打算在施工后立即使用,那么:

std::vector<MyClass>&  v = map[10];

现在构建它并且你有一个对象的本地引用。

答案 6 :(得分:3)

让我们使用一点点c ++ 11;)

typedef std::vector<MyClass>      MyClassSet;
typedef std::map<int, MyClassSet> MyClassSetMap;

MyClassSetMap map;
map.emplace(myid, MyClassSet());

要知道是否插入了这个,你可以这样做:

const auto result = map.emplace(myid, MyClassSet());
return (result.second) 
? "Is_OK"
: "Maybe "+myid+" exists\n"; 

这里是c ++ 11的旗舰和地图....如果它不存在,如何在这个地图中插入一对,如果它存在则只插入一个新的向量中的元素....

const auto result = map.emplace(myid, MyClassSet());
result.first->second.emplace(objSet);

我希望提供有用的信息!!!

答案 7 :(得分:2)

你只是缺少一对括号:

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

顺便提一下,有一个辅助函数std :: make_pair负责推导模板参数:

map.insert(make_pair(10, vector<MyClass>()));

考虑使用指向动态分配的向量的指针是一个相当糟糕的主意,因为这将使您负责管理实例。此外,由于地图不应该在内存中移动其内容,因此没有任何内容可以获得性能。

答案 8 :(得分:0)

// define my map of vector
map<int, vector<MyClass> > map;
MyClass *ptr = new MyClass();
map[0].push_back(ptr);

将对象推入MyClass类型的向量

//usage; map[0][vector_index]
map[0][0]->MyClassMember;

使用vector_index访问成员函数