2016-05-06 10 views
2

size()またはrowsの数字をstd::vector()の配列でチェックしたいと思います。std :: vectorの配列のサイズ

私は

std::vector<int> vec[3]; 

vec.size()のようなベクターは、上記のベクターの宣言では動作しません持っています。

+2

'std :: distance(std :: begin(vec)、std :: end(vec))'が必要です。 C++ 17では 'std :: size(vec)'が必要です。 –

+0

'sizeof(vec)/ sizeof(std :: vector )'を使うことができます。 –

+0

私は彼が 'vec [0] .size()+ vec [1] .size()+ vec [2] .size()'を望んでいると思います。これが本当に必要な場合は、上記の計算がvec [0] .capacity()+ vec [1] .capacity()+ vec [2] .capacity() ' – GeorgeAl

答えて

8

を試してみて、それがvecがベクトルではないので、それは(ベクトルの)アレイだだし、C++での配列はOOPの意味で(オブジェクトではありませんそれらがクラスのインスタンスではないこと)、したがってメンバ関数はありません。

3vec.size()を実行するときに結果を得たい場合は、たとえば次のいずれかを使用する必要があります。 std::array

std::array<std::vector<int>, 3> vec; 
std::cout << "vec.size() = " << vec.size() << '\n'; // Will output 3 

それともstd::arrayが、その後のベクトルのベクトルを使用して、正しいconstructorを呼び出すことによって、サイズを設定していない場合:

std::vector<std::vector<int>> vec(3); 
std::cout << "vec.size() = " << vec.size() << '\n'; // Will output 3 
+1

配列は、ユーザー定義の型であるかどうかにかかわらず、依然としてオブジェクトです。 – Galik

+0

@Galik配列は、クラスとオブジェクト(クラスのインスタンス)を持つ典型的なオブジェクト指向の意味ではオブジェクトではありません。 C++仕様では、配列を含むオブジェクトも呼び出すことができますが、混乱することがあります。 –

+0

あなたの答えをありがとう。コンパイル時や実行時にベクトルの大きさ、すなわち 'vec(3)'が必要ですか? –

1

vec.size()が動作しない理由としては

int Nrows = 3; 
int Ncols = 4 
std::vector<std::vector<int>> vec(Nrows); 
for(int k=0;k<Nrows;k++) 
    vec[k].resize(Ncols); 

... 

auto Nrows = vec.size(); 
auto Ncols = (Nrows > 0 ? vec[0].size() : 0); 
2

最初に言いたいことがstd::vector<int> vec[3];に固有のものはありませんまたは第2の索引付け操作は「行」対「列」を構成します。プログラマとしては、すべてあなた自身の視点の問題です。それは...あなたは、この3行を持つように考えるならば、あなたが使用してその数を取得することができ、あなたが#include <type_traits>する必要がありますそのため

std::extent<decltype(vec)>::value 

を...と述べました。 hereを参照してください。

とにかく、std::array<>は特に良く、より一貫性のあるインターフェースを提供するように設計されて - と、すでにstd::vectorからよく知られている:あなたはテンプレートのコードはベクトルと配列の両方を処理したい場合は

std::array<std::vector<int>, 3> vec; 
...use vec.size()... 

(一貫性が特に重要です)

関連する問題