вектор векторов push back
Я разрабатываю многоуровневый симулятор процесса очереди на C++, но у меня проблема при попытке реализовать несколько очередей (мои очереди-векторы).Так что ... , "многоуровневый" - это массив из 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" внутри "многоуровневого"?
6 ответов
при этом:
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
к нему.
объявление двумерного вектора аналогично объявлению массива. Вы также можете использовать его таким же образом...
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;
вы создаете массив vector<vector<t_PCB>>
вместо одного объекта.
Я думаю, что правильный способ сделать то, что вы хотите:
vector<vector<t_PCB>> multilevel(4);
multilevel[0].push_back(p)
вы можете создать вектор вместо массива:
std::vector< std::vector<t_PCB>> multilevel(4); // 2 dim array, 1st dim is 4
и тогда вы можете push_back в конце вектора с индексом WHICH
таким образом:
multilevel[WHICH].push_back(p)
и просто поставить его там, чтобы получить доступ к вектору векторов:
multilevel[outer][inner]
здесь outer
вернет вектор при этом индексе и дальнейшей индексации
с inner
вернет t_PCB
"объект". Вы также можете заменить индексирование в стиле массива на.at () функция для проверок границ.
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