it-roy-ru.com

вектор векторов 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
karl71

Делая это:

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] возвращает ссылку на вектор sizeth внутри multilevel, и в этом векторе вы затем вызываете функцию-член Push_back(p), которая добавляет к нему элемент p.

22
Andy Prowl

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

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
p.j

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

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

vector<vector<t_PCB>> multilevel(4);
multilevel[0].Push_back(p)
4
Hugo Corrá

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

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

и затем вы можете Push_back в конце вектора, проиндексированного с помощью WHICH, следующим образом:

multilevel[WHICH].Push_back(p)
2
4pie0

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

multilevel[outer][inner]

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

0
gitfredy