std :: вектор массива - PullRequest
       19

std :: вектор массива

1 голос
/ 19 декабря 2011

Следующая декларация проходит проверку компиляции:

int arr[3];
vector<int[3]> vec;  // ok !!

При попытке использовать vec практически как,

vec.push_back(arr);

это приводит ко многим ошибкам вроде:

/usr/include/c++/4.6/ext/new_allocator.h:108:9: error: ISO C++ forbids initialization in array new [-fpermissive]
/usr/include/c++/4.6/bits/vector.tcc:314:4: error: invalid array assignment 
/usr/include/c++/4.6/ext/new_allocator.h:118:30: error: request for member ‘~int [3]’ in ‘* __p’, which is of non-class type ‘int [3]’

Кроме того, vec не push_back() также int*.

Что здесь не так?Решается ли такая проблема в C ++ 11?

Ответы [ 3 ]

10 голосов
/ 19 декабря 2011

Основное требование к контейнерам стандартной библиотеки состоит в том, что элементы должны быть Копируемые конструктивные и Назначаемые .

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

Ссылка:

C ++ 03 Стандарт: 23.1 Требования к контейнеру [lib.container.requirements]

Параграф 3:

Тип объектов, хранящихся в этих компонентах, должен соответствовать требованиям типов CopyConstructible (20.1.3) и дополнительным требованиям Назначаемые типы.

9 голосов
/ 19 декабря 2011

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

Оператор присваивания выполняется только тогда, когда вы делаете push_back(), поэтому ваш код компилируется без него .

6 голосов
/ 19 декабря 2011

vector s, как и любые другие контейнеры, не могут хранить массивы по тем же причинам, по которым вы не можете присвоить массив другому массиву.У вас есть пара альтернатив:

  • Очевидным является использование std::vector< std::vector<int> >.
  • . Если вы хотите больше решения C ++ 11, вы можете найти егоиметь std::vector из std::array.Тогда у вас будет vec типа std::vector< std::array<int, 3> >.
...