Ваш вопрос несколько неясен.Вы не можете вставить ключ без вставки значения.Если это действительно ваше намерение, ответ: Нет.
. Для вашей цели я не вижу причин, по которым вы не могли бы вместо этого вставить пустой вектор (как отмечали другие).Для этого вы можете выполнить вставку при инициализации карты:
#include <string>
#include <map>
#include <initializer_list>
using namespace std;
class SomeClass { int x; };
int main() {
SomeClass e1, e2, e3;
map< string, vector<SomeClass> > events = // using initializer_list from c++0x
{
{"USA",{e1,e2}}, {"CANADA",{ /* no events */ }, {"MEXICO",{e2,e3}}
};
// or later ...
events["CUBA"] = {};
events["RUSSIA"] = {e1,e2,e3};
}
В качестве альтернативы, вы можете вернуть значение по умолчанию, если ключ отсутствует, когда вы его запрашиваете, то есть lazyинициализация .Поведение map
по умолчанию заключается в добавлении новой записи на карту с использованием конструктора по умолчанию типа значения всякий раз, когда запрашиваемый ключ отсутствует.Который выдает пустой vector<SomeClass>
в этом случае.Поэтому я не вижу, что не так с этим:
events["key that is missing beforehand"].push_back(e1);
Если вы действительно хотите избежать добавления новых записей на карту, вам нужно обернуть свои запросы чем-то вроде:
string key = "USA";
vector<SomeClass> localEvents; // default, empty vector
// using the auto type from c++0x
auto ev = events.find(key);
if (ev == events.end()) // not found
//events[key] = {}; // don't add the key to the map
;
else // get the corresponding vector
localEvents = (*ev).second;
Для этого вы можете также рассмотреть вопрос, связанный с этим: std :: map значение по умолчанию
(примеры отлично бы работали даже без c++0x
возможностей.)