Работа с вложеными векторами
Пытаюсь разобраться с векторами (изучаю плюсы) необходимо создать в классе вложеные вектор со следующей структурой. пример из пхп
$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 шт):
В функцию 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