Добавление пустого элемента в объявленный контейнер без объявления типа элемента

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

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

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

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

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

Ответ 1

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

table.emplace_back();

Ответ 3

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

Ответ 4

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

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

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

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

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

Ответ 5

Как пример:

    vector<int> arr;
    arr.push_back(1);
    arr.push_back(2);

Чтобы использовать его, вы должны:

включают

а также, используйте std::vector в вашем коде или добавьте

using std::vector; 

или же

using namespace std;

после строки #include.