要素数が明示的に定義されていない文字列配列内の文字列の数を合計する方法は?
string str[] = { "astring", "bstring", "cstring", "dstring", "zstring" };
配列の要素数を調べる必要がありますか?
template< typename T, size_t N >
/*constexpr*/ size_t size( T(&arr)[N]) )
{
return N;
}
constexpr
利用可能な場合 (C++11)、静的 (コンパイル時) の戻り値を別の配列のサイズとして使用できます。
str[]
が静的に定義されている場合(示されているように)、これは機能します。
const size_t numElements = sizeof(str) / sizeof(str[0]);
動的に作成される場合は、最後の要素を通知するためのマーカー0
が必要になります (通常、ポインターの配列の場合に使用されます)。それか、呼び出し元が要素の数を教えてくれます (これも一般的です)。
他の回答に既にリストされているメソッドに加えて、これを行う別の方法は、空の文字列などのガード値を配列の最後に追加することです。その後、ガード値に達するまで配列を反復処理できます。
個人的には、おそらく C++11 と
std::vector<std::string> la = { "foo", "bar", "baz" };
とにかく、実行時にクエリla.size()
を実行して、必要なものを取得できます。残念ながら、このトリックを で使用する方法std::array
が見つからないため、完全な代替手段ではありません。
ポインターを使用して配列の要素を数える 1 つの方法:
#include <iostream>
using namespace std;
int main() {
string str[] = { "astring", "bstring", "cstring", "dstring", "zstring" };
cout << ((&str)[1] - str); // 5
cout << endl;
return 0;
}
出力:
5
私は通常、配列のサイズを追跡するために別の変数を使用します。
String str[] = { "astring", "bstring", "cstring", "dstring", "zstring" };
int strNum = 5;
そして、いずれかの文字列を参照する必要がある場合は、次のように呼び出すことができます。
String foo = str[strNum-1];
ループ内で配列を更新するときはいつでも、strNum をインデックスとして使用して新しい文字列の書き込みを開始し、ループ内の各新しい文字列の直後に strNum++ を配置します。