Проблема в том, что у вас есть 3 вложенных контейнера, поэтому вам нужно добавить значения ко всем из них, чтобы сохранить ваше значение "hi"
.
Когда вы делаете это m[0][0].push_back("hi");
, вы в основном получаете доступ к позиции0
каждого vector
внутри map
, но вы не установили в них никаких значений, они пусты.
Сначала я разберу его, чтобы лучше объяснить.
С вложенными контейнерами, такими как map<int, vector<vector<string>>>
, самый простой способ понять, как они работают, - это сломать их.
map<int, vector<vector<string>>> m;
vector<string> inner; // Inner vector
vector<vector<string>> outer; // Outer vector
inner.push_back("Hi"); // Inner vector value
outer.push_back(inner); // Outer vector value
// Map holds pairs
m.insert(pair<int, vector<vector<string>>>(10, outer));
// Accessing data
cout << m[10][0][0] << endl;
Вывод
> Hi
Упрощение
При этом вы можете легко и аккуратно написать что-то вроде этого.
m.insert({20, {{"Hi2"}}});
// Accessing data
cout << m[20][0][0] << endl << endl;
Выходные данные
> Hi2
Где первый набор фигурных скобок, {20, {...}}
, - это пара, которая вставляется в map
.Думайте об этом как о map
, заботящемся только о паре int
и vector
.
Тогда у вас есть это vector
, внешние фигурные скобки {{...}}
, зная, что оно содержит еще одну vector
.
Этот vector
, внутренние фигурные скобки {""}
, знает, что он содержит строки.
По существу, с помощью фигурных скобок мы делаем то же, что описано выше, создавая отдельные значения для каждого из контейнеров, пары и двух векторов.
Расширение
Тогда выможно легко увеличить его с помощью дополнительных данных.
m.insert({25, {{"Hi2", "Hi3", "Hi4"}, {"By1", "By2"}}});
// Accessing data
cout << m[25][0][0] << endl;
cout << m[25][0][1] << endl;
cout << m[25][0][2] << endl << endl;
cout << m[25][1][0] << endl;
cout << m[25][1][1] << endl;
Вывод
> Hi2
> Hi3
> Hi4
>
> By1
> By2
Примечание
Вы можете проверить проект здесь чтобы увидеть, как это работает.
Также в c ++ map
не имеет push_back()
, но если вы хотите что-то похожее на это, вы можете использовать emplace()
и сделать что-то подобное m.emplace(20, outer)
, хотяон не работает с более короткими версиями с фигурными скобками.