Вставьте std :: map непосредственно в std :: vector - PullRequest
0 голосов
/ 05 декабря 2018

Извините, если вопрос очень тривиальный.

У меня есть вектор карт:

typedef map<char, int> edges;
typedef vector<edges> nodes;

nodes n;

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

edges e;        //declare an edge
e['c'] = 1;     //initialize it
n.push_back(e);  //push it to the vector

Как я могу просто выдвинуть пару значений ребра ('c' и 2), не объявляя переменную и не инициализируя ее?

Что-то вроде:

n.push_back(edges('c',2));

, но компилятор выдает ошибку

error: no matching function for call to ‘std::map<char, int>::map(char, int)’

Ответы [ 3 ]

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

Используйте расширенный список инициализаторов, например:

n.push_back({ {'c', 2} });

Живая демоверсия

Требуется C ++ 11 или более поздняя версия.

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

В вашем решении вы добавляете map к вектору вместо пар.Метод должен перебирать каждый элемент, чтобы поместить его в вектор.Поэтому вы можете получить доступ к элементу с помощью n[0]['c'] и т. Д.

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

#include <algorithm> 

typedef map<char, int> edges;
//change this to take pair
typedef vector<pair<char, int>> nodes;

nodes n;
edges e;        //declare an edge

//map elements are pairs
for_each(e.begin(), e.end(), [&n](pair<char, int> p) { n.push_back(p); });

Надеюсь, это поможет вам найти решение.

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

Вы можете перечислить инициализацию:

nodes vec {
    { {'a', 12}, {'b', 32} },
    { {'c', 77} },
};

vec.push_back(
        { {'d', 88}, {'e', 99} }
        );
...