декларирование размеров векторов в коллекции.C ++ - PullRequest
1 голос
/ 14 сентября 2011
using namespace std;

vector<vector<T> > vec_collection(3);

vec_collection[0]=vector<T>(12);
vec_collection[1]=vector<T>(3);
vec_collection[2]=vector<T>(14);

Предположим, у меня есть пустая коллекция из 3 векторов, и после инициализации я хочу, чтобы первый, второй и третий вектор имели определенный размер, скажем 12, 3 и 14.Является ли приведенный фрагмент кода правильным способом объявления их размеров?

Ответы [ 4 ]

7 голосов
/ 14 сентября 2011

Ваш код в принципе соответствует принципу создания отдельных временных vector экземпляров, которые заменяют существующие экземпляры нулевого размера, что в теории означает, что для каждой из этих строк у вас есть вызов конструктора (создайте временный), конструктор копирования вызов (скопировать его поверх существующего vector) и вызов деструктора (уничтожить временный).

Хотя я думаю, что некоторые оптимизации могут сделать его на самом деле лучше, чем звучит, просто сделать это проще и почти наверняка эффективнее:

using namespace std;

vector< vector<T> > vec_collection(3);

vec_collection[0].resize(12);
vec_collection[1].resize(3);
vec_collection[2].resize(14);

С другой стороны, если вам нужно, чтобы такие vector всегда были фиксированного размера, вы должны заменить их структурами данных фиксированного размера (например, struct, содержащим три массива в стиле C или std::array). ), как в ответе @ sehe .

3 голосов
/ 14 сентября 2011

Да.Несмотря на то, что это не делает векторы фиксированного размера (векторы могут быть изменены явно или неявно - например, используя push_back или insert).

Наконец, векторы можно просто назначить поверх.

Если вам нужны неровные вложенные векторы строгого типа фиксированного размера (urrfff с полным ртом):

#include <tuple>
#include <array>

using std::array;
using std::tuple;

typedef tuple<
       array<T, 12>,
       array<T, 3>,
       array<T, 14>
    > vec_collection;

С этим будет немного неудобнее работать, но если скоростьи гарантии размера контейнера имели существенное значение.

Обратите внимание, что в мире до TR1 (скажем, c ++ 98 с библиотекой c ++ 03), это было бы довольно близко к эквиваленту (но еще менее удобно работать):

struct vec_collection
{
     T a[12];
     T b[3];
     T c[14];
};
2 голосов
/ 14 сентября 2011

Если у вас есть C ++ 11, вы можете сделать это с помощью списка инициализаторов, который более эффективен:

vector<vector<T>> vec_collection(3) { vector<T>(12), vector<T>(3), vector<T>(14) };

В противном случае, вы можете сделать это так, как вы делаете, что хорошо, или просто позвонить resize на элементы, как в ответ Маттео .

0 голосов
/ 14 сентября 2011
vector< vector<T>* > vec_collection(3); // i changed it to a vector of vector<T>*


 vec_collection[0]=new vector<MyType>(12);
 //etc

Вы, вероятно, хотите заменить в коде. Например.

vector<int>(12);

Более того, если ваш вектор имеет фиксированный размер, вы можете просто использовать массивы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...