私はc ++が初めてです。配列を宣言してそのサイズを見つけたいだけです。どうすればいいですか?文字数か何かを取得し続けます。
string vidArray[] = {"fingers.mov","motion_test.mov"};
int numVids = vidArray->size();
私はc ++が初めてです。配列を宣言してそのサイズを見つけたいだけです。どうすればいいですか?文字数か何かを取得し続けます。
string vidArray[] = {"fingers.mov","motion_test.mov"};
int numVids = vidArray->size();
Just use
vector<string> s{"s1", "s2", "s3"};
for the initialization of your "array".
then you can use
s.size()
to get the size of the vector.
まず最初に、あなたが行ったvidArray->size()呼び出しはvidArray[0].call()と同等です。なぜなら、配列は最初の要素を指すポインターに他ならないからです。実行中: (*vidArray).size().
このような古い配列には size() がありませんが、配列のカウントを取得するためのマクロに基づくお勧めできないハックがあります。
#define COUNTOF(arr) (sizeof(arr) / sizeof(arr[0]))
COUNTOF(vidArray)
これにより配列サイズが返されますが、これは素晴らしいことではありません (説明)。そのため、動的なサイズ変更が必要な場合は std::vector を使用することをお勧めします。
std::vector<std::string> vid;
vid.push_back("fingers.mov");
vid.push_back("motion_test.mov");
size_t vidSize = vid.size();
boost::assign を使用してこの方法で初期化することもできます ( Documentation )
std::vector<std::string> vid;
vid += std::string("fingers.mov"),std::string("motion_test.mov");
または、サイズを変えることができない配列が必要な場合は、boost::array (ドキュメント) (つまり、コメントで Walter が述べているように、既に c++11 を使用している場合は、boost:: である std::array を使用できます)。配列ですが、標準ライブラリにあります)
boost::array<std::string,2> vid = {std::string("fingers.mov"),std::string("motion_test.mov")};
size_t vidSize = vid.size();
配列は、渡されると最初の要素へのポインターに減衰します。これはあなたの場合にも起こります - あなたは取得string*
し、実際に文字列のメンバー関数を呼び出しますsize()
。保持している文字数を返します。
必要なことを行うには、配列の合計サイズを 1 つの要素のサイズで割ります。
int numVids = sizeof(vidArray) / sizeof(string);
C++ では、配列はオブジェクトではありません。size() のようなメソッドはありません。呼び出しているのは、配列の最初の文字列の size() メソッドです。これは、配列のメモリ アドレスが最初のエントリのメモリ アドレスでもあるためです。
配列のように動作するスマート コンテナ クラスが必要な場合は、 std::vectorを使用できます。size() 関数など、便利な関数がたくさん付属しています。
@Philippが示唆したようstdd::vector
に、一般的に配列よりもコンテナのようなものを好むべきです。ただし、だからといって基本を飛ばしていいというわけではありません。そのため、言語を習得するまで STL などのライブラリを使用しないことをお勧めします。
配列のサイズ、つまり要素数を取得するには、配列のサイズをバイト単位sizeof
で返す演算子を使用します。
int arr[10];
size_t element_count = sizeof arr / sizeof arr[0];
配列を関数に渡すと、ポインターに減衰するため、これは機能しないことに注意してください。
void foo(int arr[10]) {
// element_count == sizeof int*, oops
size_t element_count = sizeof arr;
}
この場合、配列のサイズも関数に渡す必要があります
void foo(int *arr, size_t size) {
}
このことをしっかりと把握したら、より安全で便利な容器のようなvector
. 必要に応じて動的に拡張し、要素が連続したメモリ (配列など) に格納されることを保証し、(必要に応じて) のような安全なアクセス方法を提供し::at()
、手動のメモリ管理について心配する必要はありません。