web-dev-qa-db-ja.com

std :: get()を使用してベクターのメンバーを取得できないのはなぜですか?

std::get()関数について混乱しています。 std::get()を使用して、arraypair、およびTupleのメンバーにアクセスできます。では、なぜ標準はvectorのメンバーへのアクセスも許可しないのですか?

_#include <iostream>
#include <array>
#include <vector>
#include <Tuple>
#include <utility> // std::pair
using namespace std;
int main()
{
    array<int, 4> a1{3,4,5,67};
    pair<int,int>  p1{5,6};
    Tuple<int,float,float> t1{6,5.5,4.5};

    cout << std::get<1>(a1) <<endl;
    cout << std::get<1>(p1) <<endl;
    cout << std::get<1>(t1) <<endl;
}
_

出力は次のとおりです。

_4
6
5.5
_

しかし、std::get()vectorと一緒に使用しようとすると、次のコンパイルエラーが発生します。

_#include <iostream>
#include <array>
#include <vector>
#include <Tuple>
#include <utility> // std::pair
using namespace std;
int main()
{
 vector<int> v1{4,5,6,7,9};
 cout << std::get<1>(v1) <<endl;
}
_

コンパイルエラー:

_  main.cpp: In function 'int main()':
  main.cpp:10:27: error: no matching function for call to 'get(std::vector&)'
  cout << std::get<1>(v1) <<endl;
                       ^
  In file included from main.cpp:2:0:
 /usr/include/c++/5/array:280:5: note: candidate: template constexpr _Tp& 
  std::get(std::array<_Tp, _Nm>&)
  get(array<_Tp, _Nm>& __arr) noexcept
  ^
_
23
Alok

std::getのインデックスはテンプレートパラメータであるため、コンパイル時にインデックスが有効かどうかを確認できます。これは、コンテナのサイズがコンパイル時にもわかっている場合にのみ可能です。 std::vectorのサイズは可変です。実行時に要素を追加または削除できます。これは、ベクトルのstd::getoperator[]またはatよりもメリットがないことを意味します。

47
user743382