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

Я разрабатываю многоуровневый симулятор процессов в С++, но у меня проблема при попытке реализовать несколько очередей (мои очереди - это векторы). Итак, "многоуровневый" представляет собой массив из 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" внутри "многоуровневый"?

Ответы

Ответ 1

Сделав это:

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 к нему.

Ответ 2

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

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;

Ответ 3

Вы создаете массив 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

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

multilevel[WHICH].push_back(p)

Ответ 5

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

multilevel[outer][inner]

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

Ответ 6

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