вектор векторов push_back

Я разрабатываю симулятор многоуровневого процесса очереди в C ++, но у меня возникла проблема при попытке реализовать несколько очередей (мои очереди являются векторами).
«multilevel» — массив из 4 элементов (не вектор). Внутри каждого из этих элементов есть вектор (тип t_PCB).

vector<vector<t_PCB>> multilevel[4];

Мой вопрос: как я могу вставить элемент в конце одного из этих 4 t_PCB векторы? Заранее спасибо.

Я пробовал строку кода ниже, но она не работает (ошибка: не соответствует функция-член для вызова push_back

multilevel[0].push_back(p); //where "p" is a t_PCB object

Строка сверху не может использоваться, когда речь идет о «многоуровневом», потому что этот массив принимает только аргументы типа: vector < t_PCB>

Итак, как я спрашиваю в начале: как я могу вставить объект типа «t_PCB» внутрь «многоуровневого»?

20

Решение

Делая это:

vector<vector<t_PCB> > multilevel[4];

Вы объявляете массив из четырех нулевых vectorsкаждый из которых может содержать объекты типа vector<t_PCB>, То, что вы, вероятно, хотели сделать, это скорее:

vector<vector<t_PCB> > multilevel(4);
//                               ^^^

Это создаст экземпляр вектора из четырех инициализированных по умолчанию объектов типа vector<t_PCB>, Затем вы можете просто сделать:

multilevel[size].push_back(p);

Обратите внимание, что векторные индексы (например, индексы массива) начинаются с нуля, поэтому size должен быть меньше размера вектора.

В вышеприведенном выражении подвыражение multilevel[size] возвращает ссылку на sizeвектор внутри multilevelи на этом векторе вы затем вызываете функцию-член push_back(p), который добавляет элемент p к этому.

22

Другие решения

Объявление двумерного вектора похоже на объявление массива. Вы также можете использовать его таким же образом …

vector<vector<int> > vec;

for(int i = 0; i < 5; i++)
{
vector<int> row;
vec.push_back(row);
}

vec[0].push_back(5);
cout << vec[0][0] << endl;
18

Вы создаете массив vector<vector<t_PCB>> вместо одного объекта.

Я думаю, что правильный способ сделать то, что вы хотите, это:

vector<vector<t_PCB>> multilevel(4);
multilevel[0].push_back(p)
4

Вы можете создать вектор вместо массива:

std::vector< std::vector<t_PCB>> multilevel(4); // 2 dim array, 1st dim is 4

и тогда ты сможешь отталкивать в конце вектора, проиндексированного WHICH сюда:

multilevel[WHICH].push_back(p)
2

И просто поставить его там, чтобы получить доступ к вектору векторов:

multilevel[outer][inner]

где outer вернет вектор по этому индексу и дальнейшее индексирование
с inner вернет t_PCB объект. Вы также можете заменить индексирование в стиле массива на .в() функция для проверки границ.

0
vector<vector<int>> vec; // declare 2D vector

for (int i=0; i<=3; i++) {
vector<int> row;  // create a row vector which adds a row to vec
for (int j=0; j<=4; j++) {
row.push_back(j*10); // push elements 0,10,20,30,40 to row
}
vec.push_back(row); // add this row to vec
// Repeat this procedure 4 times to make a 4*5 2D vector
}

cout<<"output is "<<vec[2][4]; // output is 40
-1
По вопросам рекламы [email protected]