std ::配列のベクトル

宣言に続いてコンパイルチェックが渡されます:

int arr[3];
vector 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 int * push_back()しません。

ここで何が間違っていますか?そのような問題はC ++ 11で解決されていますか?

1
@SethCarnegie、あなたは正しいです。それは答えでなければなりません。私は配列が代入可能でないという事実を忘れてしまった。
追加された 著者 iammilind,
配列は代入不可能なので、コンテナに格納することはできません。代入演算子は、 push_back を実行したときに試行されます。これは、コードがそのコードなしでコンパイルされる理由です。
追加された 著者 Seth Carnegie,

3 答え

標準ライブラリコンテナの基本要件は、要素がコンポジットコピー可能割り当て可能であることです。

配列は代入可能ではないため、標準ライブラリコンテナエレメントとして使用することはできません。

参照:

C ++ 03標準:23.1コンテナ要件[lib.container.requirements]

Para 3:

これらのコンポーネントに格納されているオブジェクトのタイプは、 CopyConstructible タイプ(20.1.3)の要件と割り当て可能タイプ

10
追加された
標準の見積もり+1。
追加された 著者 iammilind,
+1も見積もりで見つけられませんでした。
追加された 著者 AusCBloke,

標準ライブラリコンテナで使用されるすべてのオブジェクトの要件である、割り当て可能でもコピー可能でもないため、配列をコンテナに格納することはできません。

代入演算子は、 push_back()を実行したときに試行されるため、コードはコードなしでコンパイルされます

9
追加された

vectors, like any other containers, are unable to store arrays, for the same reasons that you can't assign an array to another array. You have a couple of alternatives:

  • The obvious one is to use an std::vector< std::vector >.
  • If you want a more C++11 solution, you may find it better to have an std::vector of std::array. You would then have vec be of type std::vector< std::array > .
6
追加された