2013-04-05 2 views
15

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

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» внутри «многоуровневый»?

+0

многоуровневый не является «4 элементов вектора», но массив вектора, содержащего векторы t_PCB – Paranaix

ответ

16

Делая это:

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

+0

этого код -> многоуровневый [размер] .push_back (р); работает только в том случае, если многоуровневое объявлено следующим образом; vector многоуровневый [4]; – karl71

+0

очевидно, что у меня ошибка, если я использую эту строку в своем коде – karl71

+0

@ jafm92 Посмотрите внимательно. Вам нужно изменить '[4]' на '(4)'. Вы объявляли массив векторов векторов. Энди показывает вам, как объявить только вектор векторов. С другой стороны, 'vector multilevel [4]' представляет собой массив векторов. Вам нужно решить, какой из них вы хотите. –

4

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

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

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

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

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

, а затем вы можете push_back в конце вектора индексируется с WHICH таким образом:

multilevel[WHICH].push_back(p) 
16

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

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; 
0

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

multilevel[outer][inner] 

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

-1
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 
Смежные вопросы