Работа с вложеными векторами

Пытаюсь разобраться с векторами (изучаю плюсы) необходимо создать в классе вложеные вектор со следующей структурой. пример из пхп

$array [i][0] = "head";
$array [i][1] = "text";

Инициирую с++

std::vector<std::vector<std::string>> in_queue;

теперь необходима функция, принимающая 2 параметра и добавляющая в ввектор.

Не работает    
void add_in_queue(std::string &head, std::string &command) {
    in_queue.push_back(head, command);
}

И слудующая функция которя берет данные из вектора и затем стирает их.

Это еще не реализовал, так как заглох на этапе выше.
void job_in_queue(void) {
int i = 0;
while(true){
    head = in_queue[i][0];
    text = in_queue[i][1];
    in_queue.erase(i);
    function(head ,text );
    ++i;
    }
}

Как правильно реализовать подобный класс?


Ответы (1 шт):

Автор решения: maestro

В функцию push_back нужно передавать только один параметр, и именно того типа, который указан в угловых скобках, а именно std::vector<std::string>. Поэтому вам надо сначала создать новый вложенный вектор, и уже его передать в функцию, а не пихать туда строки.

in_queue.push_back(std::vector<std::string>({head, command}));

Здесь происходит следующее: конструируется вектор, который сразу заполняется элементами с помощью initializer_list. Вектор передается в функцию push_back, которая добавляет его в корневой вектор.

Теперь про вторую часть, а именно про удаление элементов из вектора. При удалении надо не забывать, что те элементы, которые раньше находились после удаляемого, сдвигаются влево. Также обратите внимание, что функция erase принимает не индекс, а итератор удаляемого элемента. Вот так будет правильно:

void job_in_queue(void) {
int i = 0;
for (auto it = in_queue.begin(); it != in_queue.end();)
{
    head = *it[0];
    text = *it[1];
    function(head ,text );
    it = in_queue.erase(it):
}

А ещё есть хороший ресурс по c++, где ко многим классам приведены примеры использования: https://en.cppreference.com/w/cpp/container/vector/erase

→ Ссылка