std ::数组的向量

时间:2011-12-19 05:49:46

标签: c++ arrays vector compiler-errors

以下声明通过编译检查:

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 个答案:

答案 0 :(得分:10)

标准库容器的基本要求是元素应可复制构建可分配

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

参考:

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

第3段:

  

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

答案 1 :(得分:9)

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

只有在执行push_back()时才会尝试使用赋值运算符,这就是为什么代码在没有它的情况下编译的原因。

答案 2 :(得分:6)

与任何其他容器一样,

vector无法存储数组,原因与您无法将数组分配给另一个数组的原因相同。你有几个选择:

  • 显而易见的是使用std::vector< std::vector<int> >
  • 如果您想要更多C ++ 11解决方案,您可能会发现拥有std::vector std::array更好。然后,您vec的类型为std::vector< std::array<int, 3> >