STL中的矢量地图?

问题描述 投票:24回答:9

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

// 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>)); 
c++ stl
9个回答
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();

18
投票

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

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

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

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


6
投票

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

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

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

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


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
投票

您应该阅读编译错误消息。他们通常会为您提供所需的所有信息。 您的代码在该字符串中给出了错误'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>() ) );

3
投票

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

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

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

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

现在它被构造,你有一个对象的本地引用。


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和map的旗舰....如果它不存在,如何在这个地图中插入一对,如果它存在只是在向量中插入一个新元素....

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

我希望提供有用的信息!


2
投票

你只是缺少一对括号:

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

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

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

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


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访问成员函数

© www.soinside.com 2019 - 2024. All rights reserved.