std::get()
関数について混乱しています。 std::get()
を使用して、array
、pair
、および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
^
_
std::get
のインデックスはテンプレートパラメータであるため、コンパイル時にインデックスが有効かどうかを確認できます。これは、コンテナのサイズがコンパイル時にもわかっている場合にのみ可能です。 std::vector
のサイズは可変です。実行時に要素を追加または削除できます。これは、ベクトルのstd::get
がoperator[]
またはat
よりもメリットがないことを意味します。