【问题标题】:std::vector of an array数组的 std::vector
【发布时间】:2011-12-19 05:49:45
【问题描述】:

以下声明通过编译检查:

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 解决了这样的问题吗?

【问题讨论】:

  • 您不能将数组存储在容器中,因为它们不可分配。仅当您执行 push_back 时才会尝试赋值运算符,这就是您的代码在没有它的情况下编译的原因。
  • @SethCarnegie,你是对的。这应该是一个答案。我错过了数组不可分配的事实。

标签: c++ arrays vector compiler-errors


【解决方案1】:

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

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

参考:

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

第 3 段:

这些组件中存储的对象类型必须满足CopyConstructible类型(20.1.3)的要求,以及Assignable types的附加要求。

【讨论】:

    【解决方案2】:

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

    仅当您执行 push_back() 时才会尝试赋值运算符,这就是您的代码在没有它的情况下编译的原因。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-10-26
        • 2020-08-20
        • 2013-07-08
        • 1970-01-01
        • 2019-04-23
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        • 2021-08-13
        相关资源
        最近更新 更多