Ответ 1
Из CLion IntelliSense я позже обнаружил, что одним полезным методом является emplace_back()
. Это создает новый объект правильного типа и добавляет его в конец вектора.
table.emplace_back();
Когда мы используем сложный контейнер в C++, как
std::vector<std::map<std::string, std::set<std::string>>> table;
Единственный способ добавить пустую карту (которая может представлять строку или столбец) - это инициализировать новый элемент и вернуть его обратно. Например с
table.push_back(std::map<std::string, std::set<std::string>>());
Есть ли способ избежать повторного выделения типа и просто добавить правильный типизированный элемент?
Из CLion IntelliSense я позже обнаружил, что одним полезным методом является emplace_back()
. Это создает новый объект правильного типа и добавляет его в конец вектора.
table.emplace_back();
Вы можете воспользоваться инициализацией копирования списка (начиная с С++ 11) и просто написать
table.push_back({});
До C+ +1 1 иногда я использую x.resize(x.size()+1)
, в C+ +1 1 или позже вы можете использовать x.push_back({})
.
Хотя другие ответы верны, я добавлю, что если вы не можете использовать этот подход, вы могли бы выиграть от объявления псевдонимов некоторых типов, чтобы сократить это имя типа контейнера.
Конечно, я могу только догадываться о логическом значении ваших контейнеров, и это еще одна вещь, которую это исправляет!
using PhilosopherNameType = std::string;
using NeighboursType = std::set<PhilosopherNameType>;
using NeighbourMapType = std::map<PhilosopherNameType, NeighboursType>;
std::vector<NeighbourMapType> table;
table.push_back(NeighbourMapType());
Я упоминаю об этом, потому что вы, вероятно, все еще можете извлечь выгоду из этого в других местах.
Как пример:
vector<int> arr;
arr.push_back(1);
arr.push_back(2);
Чтобы использовать его, вы должны:
а также, используйте std::vector
в вашем коде или добавьте
using std::vector;
или же
using namespace std;
после строки #include
.