我想要一个矢量图,(但我不想使用指针作为内部矢量),是否可能?
// 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>));
第一个数据结构将起作用。你可能想要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();
是的,但你的第二行应该是:
map.insert(pair<int, vector<MyClass> >(10, vector<MyClass>()));
这将插入一个由整数10和空向量组成的对。两者都将被复制,如果您正在处理大型向量,那么您将需要小心复制。
另外:在using namespace std
时不要调用变量“map”。你吓到我了 ;-)
使用fbrereton中的typedef你也可以这样做:
typedef std::vector<MyClass> MyClassSet;
typedef std::map<int, MyClassSet> MyClassSetMap;
MyClassSetMap map;
map[10]=MyClassSet();
您可以使用operator[]
而不是insert().
这样可以节省线路噪音。
使用交换功能有效地添加矢量。
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);
您应该阅读编译错误消息。他们通常会为您提供所需的所有信息。
您的代码在该字符串中给出了错误'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>() ) );
你可以使用[]运算符。 这些会将值插入到地图中。
map[10]; // create the 10 element if it does not exist
// using the default constructor.
如果您打算在施工后立即使用,那么:
std::vector<MyClass>& v = map[10];
现在它被构造,你有一个对象的本地引用。
让我们使用一点点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);
我希望提供有用的信息!
你只是缺少一对括号:
map.insert(pair<int, vector<MyClass> >(10, vector<MyClass>()));
顺便说一句,有一个辅助函数std :: make_pair负责推导模板参数:
map.insert(make_pair(10, vector<MyClass>()));
考虑使用指向动态分配的向量的指针是一个相当糟糕的主意,因为这将使您负责管理实例。此外,由于地图不应该在内存中移动其内容,因此也没有任何内容可以获得性能。
// 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访问成员函数