std ::数组的向量

iam*_*ind 1 c++ arrays compiler-errors vector

以下声明通过编译检查:

int arr[3];
vector<int[3]> vec;  // ok !!
Run Code Online (Sandbox Code Playgroud)

当试图vec实际使用时,

vec.push_back(arr);
Run Code Online (Sandbox Code Playgroud)

它导致许多错误,如:

/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]’
Run Code Online (Sandbox Code Playgroud)

另外,vec也不push_back()是int*.

这到底出了什么问题?是否在C++ 11中解决了这个问题?

Alo*_*ave 10

标准库容器的基本要求是元素应该是Copy constructible和Assignable.

数组不可分配,因此错误,您不能将它们用作标准库容器元素.

参考:

C++ 03标准:23.1容器要求[lib.container.requirements]

第3段:

存储在这些组件中的对象类型必须满足CopyConstructible类型(20.1.3)的要求,以及可分配类型的附加要求.


Set*_*gie 9

您不能将数组存储在容器中,因为它们既不可分配也不可复制,这是与标准库容器一起使用的所有对象的要求.

当你做赋值运算符是唯一尝试push_back()这就是为什么你的代码编译没有它.


Aus*_*oke 6

vector与任何其他容器一样,s无法存储数组,原因与您无法将数组分配给另一个数组的原因相同.你有几个选择:

  • 显而易见的是使用std::vector< std::vector<int> >.
  • 如果你想要一个更C++ 11的解决方案,你会发现它最好有一个std::vector的std::array.那你就是vec那种类型std::vector< std::array<int, 3> >.