STL中的矢量地图?

che*_*hen 26 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>)); 
Run Code Online (Sandbox Code Playgroud)

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

// 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>)); 
Run Code Online (Sandbox Code Playgroud)

fbr*_*eto 31

第一个数据结构将起作用.您可能希望使用typedef某些代码来简化以后的工作:

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

MyClassSetMap map;
map.insert(MyClassSetMap::value_type(10, MyClassSet()));
Run Code Online (Sandbox Code Playgroud)

或者(感谢quamrana):

map[10] = MyClassSet();
Run Code Online (Sandbox Code Playgroud)


Ste*_*sop 18

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

map.insert(pair<int, vector<MyClass> >(10, vector<MyClass>()));
Run Code Online (Sandbox Code Playgroud)

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

另外:不要调用变量"map" using namespace std.你吓到我了 ;-)

  • +1指出"使用std命名空间的地图":)也吓到了我 (6认同)
  • 它可以更轻松地编写`map.insert(标准:: make_pair(10,矢量<MyClass的>()));` (4认同)
  • 为什么不使用里面的地图类型.地图:: VALUE_TYPE! (2认同)

qua*_*ana 6

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

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

MyClassSetMap map;
map[10]=MyClassSet();
Run Code Online (Sandbox Code Playgroud)

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


Kur*_*erg 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); 
Run Code Online (Sandbox Code Playgroud)


Kir*_*sky 5

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

map.insert(pair<int, vector<MyClass> >(10, vector<MyClass>()));
Run Code Online (Sandbox Code Playgroud)

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

map.insert( make_pair( 10, vector<MyClass>() ) );
Run Code Online (Sandbox Code Playgroud)


Mar*_*ork 5

你可以使用[]运营商。

它将值插入到地图中:

map[10]; // create the 10 element if it does not exist
         // using the default constructor.
Run Code Online (Sandbox Code Playgroud)

如果您要在构造后不久使用该值,则:

std::vector<MyClass>&  v = map[10];
Run Code Online (Sandbox Code Playgroud)

现在它已经构建完成,并且您拥有了对该对象的本地引用。