Добавление пустого элемента в объявленный контейнер без объявления типа элемента - PullRequest
15 голосов
/ 25 марта 2019

Когда мы используем сложный контейнер в C ++, например

std::vector<std::map<std::string, std::set<std::string>>> table;

Единственный способ добавить пустую карту (которая может представлять строку или столбец) - это инициализировать новый элемент и вернуть его обратно. Например с

table.push_back(std::map<std::string, std::set<std::string>>());

Есть ли способ избежать повторного выделения типа и простого добавления правильного типизированного элемента?

Ответы [ 4 ]

33 голосов
/ 25 марта 2019

Из IntelliSense от CLion я позже обнаружил, что один полезный метод - emplace_back(). Это создает новый объект правильного типа и добавляет его в конец вектора.

table.emplace_back();
24 голосов
/ 25 марта 2019

Вы можете воспользоваться copy-list-initialization (начиная с C ++ 11) и просто написать

table.push_back({});
10 голосов
/ 25 марта 2019

До C ++ 11 иногда я использую x.resize(x.size()+1), в C ++ 11 или новее вы можете использовать x.push_back({}).

5 голосов
/ 25 марта 2019

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

Конечно, я могу только догадываться о логическом значении ваших контейнеров, и это еще одна вещь, которую это исправляет!

 using PhilosopherNameType = std::string;
 using NeighboursType      = std::set<PhilosopherNameType>;
 using NeighbourMapType    = std::map<PhilosopherNameType, NeighboursType>;

 std::vector<NeighbourMapType> table;
 table.push_back(NeighbourMapType());

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...