25

だから私は文字列の配列を持っています。次に例を示します。

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

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

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

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

4

10 に答える 10

42

文字列の配列が与えられた場合、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を参照してください。

それが役に立てば幸い。幸運を!

于 2013-01-13T23:20:58.573 に答える
7

テンプレート関数を使用してそれを達成できます:

#include<cstdlib>

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

Luchian Grigore が言ったように、STL コンテナーを使用する必要があります。静的 C 配列と同等のものが必要な場合は std::array 。

于 2013-01-13T22:36:10.507 に答える
3

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

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

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

于 2014-12-08T10:28:11.627 に答える
1

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

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();
}
于 2013-01-13T22:32:43.487 に答える
1

必須のアドバイス:を使用してstd::vector<std::string>ください。

このような関数が役立ちます:

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

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

于 2013-01-13T22:33:32.347 に答える