web-dev-qa-db-ja.com

C ++で文字列配列のサイズを見つける

したがって、文字列の配列があります。以下に例を示します。

string array[] = {"Example", "Example2", "Example3"};

上記のような配列内の要素の数を見つける方法はありますか?私はこの方法を使用できません:

int numberofelements = sizeof(array)/sizeof(array[0]);

これは、要素のサイズが異なるためです。別の方法はありますか?

21
turnt

文字列の配列を指定すると、sizeof(array)/sizeof(array[0])を使用してそのサイズを取得でき、次のプログラムは問題なく動作します。

int main()
{
    std::string array[] = { "S1", "S2", "S3" };
    std::cout << "A number of elements in array is: "
              << sizeof(array)/sizeof(array[0]) << '\n';
    foo(array);
}

要素のサイズはさまざまであると言うことで何を意味するのかは明確ではありません。配列の要素のサイズは、コンパイラー時に常に知られており、例外はありません。

ただし、上記が機能しない場合があります。次の例を考えてみましょう。

void foo(std::string array[])
{
    std::cout << "A number of elements in array is: "
              << sizeof(array)/sizeof(array[0]) << '\n';
}

上記のコードは失敗する運命にあります。最初は少し奇妙に見えるかもしれませんが、この理由は実際には非常に単純です-これは配列減衰と呼ばれます。これは、配列を関数に渡すたびに、その型がポインターの型に自動的に減衰することを意味します。したがって、上記の関数は実際にはこれと同等です:

void foo(std::string *array)
{
}

また、最初の例でsizeof演算子が配列の合計サイズを返す場合、2番目の例では、その配列へのポインターのサイズを返しますが、これはまったく異なるものです。

通常、人々はそれについて2つの方法があります。 1つ目は、アプリケーションが最後の要素を見つけて配列の長さを計算するまで配列を走査できるように、配列の特別な「最後の」要素を追加することです。文字列リテラルはこの完璧な例です。すべての文字列リテラルは「\ 0」で終わり、その長さはいつでも計算できます。以下に例を示します。

static void foo(const std::string *array)
{
    size_t i = 0;
    while (!array[i].empty())
        ++i;
    std::cout << "Array length is: " << i << std::endl;
}

欠点は明らかに、その長さを決定するために配列を横断する必要があることです。配列の長さを常に運ぶ2番目の方法、例えば:

static void foo(const std::string *array, size_t length)
{
    // ...
}

void bar()
{
    std::string array[] = { "S1", "S2", "S3" };
    foo(array, sizeof(array)/sizeof(array[0]));
}

C++では、テンプレートを使用して配列の長さを差し引くことができます。次に例を示します。

template <size_t array_length>
static void foo(const std::string (&array)[array_length])
{
    std::cout << "A number of elements in template array is: "
              << array_length << '\n';
}

上記のすべては、言語に組み込まれている単純な配列に適用されます。一方、C++は豊富な高レベルコンテナのセットを提供し、柔軟性を大幅に高めます。そのため、C++標準ライブラリの一部として使用可能なコンテナの1つを使用することを検討してください。標準コンテナのリストについては、— http://en.cppreference.com/w/cpp/container を参照してください

それが役に立てば幸い。がんばろう!

32
user405725

あなたはそれを達成するためにテンプレート関数を使用できます:

#include<cstdlib>

template<class T, std::size_t n>
constexpr std::size_t size(T (&)[n])
{ return n; }

そして、Luchian Grigoreが言ったように、STLコンテナを使用する必要があります。静的C配列に相当する場合は、std :: array。

7

あなたはまだ使用することができます

_int numberofelements = sizeof(array)/sizeof(array[0]);
_

これは、sizeof(array)が各文字列に対応するポインターのサイズの合計を返すためです。 sizeof(array[0])は、最初の文字列に対応するポインターのサイズを返します。したがって、sizeof(array)/sizeof(array[0])は文字列の数を返します。

2
deerishi

stdlibライブラリに標準機能があります:

#include <stdlib.h>
static const char * const strings[] = {"str1", "str2", "str3"};
const int stringCount = _countof(strings);
2
vitperov

別の例を次に示します。

string array[] = {"Example", "Example2", "Example3"};
int numberofelements = 0; for(auto c: array) { numberofelements++; };
// now numberofelements will contain 3
1
serup

size()関数を使用するだけで、配列の要素数を見つけることができます。

サンプルコード:

string exampleArray[] = { "Example", "Example2", "Example3" };
    int size_of_array = size(exampleArray);

cout << "Number of elements in array = " << size_of_array << endl;

出力:

>>> Number of elements in array = 3

お役に立てば幸いです。

1
Arslan Ahmad

これはあなたが探しているものですか?

string array[] = {"Example", "Example2", "Example3"};
int num_chars = 0;
int num_strings = sizeof(array)/sizeof(array[0]);
for (int i = 0; i < num_strings; i++) {
    num_chars += array[i].size();
}
0
Mr Fooz

必須のアドバイス:se std::vector<std::string>

このような機能は次の場合に役立ちます。

template<typename T, int sz>
int getSize(T (&) [sz])
{
    return sz;
}

要素のサイズは変わらないため、メソッドも機能します-std::stringは、保持する実際の文字列に関係なく、一定のサイズを持ちます。

0
Luchian Grigore
string s[] = {"Apple","banana","cherry","berry","kiwi"};
int size = *(&s+1)-s;  
// OR
int size = sizeof(s)/sizeof(s[0]);

最初のものに関する詳細情報: https://aticleworld.com/how-to-find-size-of-array-in-cc-without-using-sizeof/

0
Pygirl