Как создать карту векторов векторов в C ++? - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь создать карту, содержащую векторы, содержащие векторы, но я получаю сообщение об ошибке при попытке получить доступ к элементу.

Это мой код:

#include <iostream>
#include <map>
#include <vector>
#include <string>

using namespace std;

int main()
{
    map<int, vector<vector<string>>> m;
    m[0][0].push_back("hi");
    return 0;
}

Вы можетепопробуйте здесь: https://onlinegdb.com/HytLmjQJV

Я получаю ошибку в Visual Studio:

Ошибка отладки. Программа: Выражение: векторный индекс находится вне диапазона.

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Проблема в том, что у вас есть 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), хотяон не работает с более короткими версиями с фигурными скобками.

0 голосов
/ 04 декабря 2018

Пока вы пытаетесь правильно добавить этот вектор, вы ничего не добавили к своему вектору.Вы пытаетесь захватить что-то, чего там нет.

Вам нужно будет поместить что-то в этот первый вектор.

m[0].pushback();
m[0][0].pushback("hi");

альтернативно, вы можете создать вектор, который вы 'сначала держимся внутри этого первого вектора.

vector<string> vec1;
vec1.pushback("hi");

m[0].pushback(vec1);
0 голосов
/ 04 декабря 2018

m [0] - пустой вектор в вашем коде, поэтому вы не можете получить доступ к его первому элементу (m [0] [0]).Вам нужно создать вектор внутри, например

m[0].push_back({});
m[0][0].push_back("hi");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...