Хранение стандартной карты на карте - PullRequest
26 голосов
/ 18 декабря 2010

Я должен хранить std :: map как значение в std :: map

std::map< std::string, std::map<std::string, std::string> > someStorage;

Как вставить во вторую (внутреннюю) карту? Я пробовал с:

someStorage.insert( std::make_pair("key", std::make_pair("key2", "value2")) );

Но это вызывает много ошибок. Что не так?

Ответы [ 5 ]

40 голосов
/ 18 декабря 2010

Попробуйте:

std::map< std::string, std::map<std::string, std::string> > someStorage;

someStorage["Hi"]["This Is Layer Two"] = "Value";
21 голосов
/ 18 декабря 2010
someStorage["key"].insert(std::make_pair("key2", "value2")));

Если вы все еще хотите использовать вставку и на внешней карте, вот один из способов сделать это

std::map<std::string, std::string> inner;
inner.insert(std::make_pair("key2", "value2"));
someStorage.insert(std::make_pair("key", inner));
4 голосов
/ 18 декабря 2010

Карта имеет метод вставки, который принимает пару ключ / значение. Ваш ключ имеет тип string, так что это не проблема, но ваше значение равно не пары типов (которую вы генерируете), а карты типов. Поэтому вам нужно либо сохранить полную карту в качестве значения , либо , чтобы изменить исходное определение карты, чтобы принять пару в качестве значения.

3 голосов
/ 17 января 2017

// Попробуйте это:

std::map< std::string, std::map<std::string, std::string> > myMap;

myMap["key one"]["Key Two"] = "Value";
myMap["Hello"]["my name is"] = "Value";

// Для печати карты:

for( map<string,map<string,string> >::const_iterator ptr=myMap.begin();ptr!=myMap.end(); ptr++) {
    cout << ptr->first << "\n";
    for( map<string,string>::const_iterator eptr=ptr->second.begin();eptr!=ptr->second.end(); eptr++){
        cout << eptr->first << " " << eptr->second << endl;

    }

}
0 голосов
/ 30 апреля 2019

Также вы можете использовать инициализацию списка:

someStorage.insert( std::make_pair("key", std::map<std::string, std::string> {std::make_pair("key2", "value2")}) );
...