Подтвердить что ты не робот

Поиск размера массива String в С++

Итак, у меня есть массив строк. Вот пример:

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

Есть ли способ найти число элементов в массиве, подобном приведенному выше. Я не могу использовать этот метод:

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

Это связано с тем, что размер элементов меняется. Есть ли другой способ?

4b9b3361

Ответ 1

Учитывая ваш массив строк, вы можете, безусловно, использовать 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 возвращает общий размер массива, во втором примере он возвращает размер указателя на этот массив, что совсем другое.

Обычно есть два способа, которыми люди обходятся. Первый заключается в том, чтобы добавить специальный "последний" элемент массива, чтобы приложение могло перемещаться по массиву, пока не увидит последний элемент, и вычислить длину массива. Строковые литералы - прекрасный пример этого - каждый строковый литерал заканчивается на '\ 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;
}

Недостатком, очевидно, является необходимость пересечения массива для определения его длины. Второй способ всегда иметь длину массива, например:

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]));
}

В С++ вы можете использовать шаблон для вычитания длины массивов, например:

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';
}

Все вышеизложенное относится к простым массивам, встроенным в язык. С другой стороны, С++ предоставляет богатый набор контейнеров более высокого уровня, что дает вам большую гибкость. Поэтому вы можете захотеть использовать один из контейнеров, доступных вам как часть стандартной библиотеки С++. Список стандартных контейнеров см. В разделе http://en.cppreference.com/w/cpp/container

Надеюсь, это поможет. Удачи!

Ответ 2

Вы можете использовать функцию шаблона для достижения этого:

#include<cstdlib>

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

И, как сказал Лучиан Григоре, вы должны использовать STL-изоляторы. std:: array, если вы хотите, чтобы это эквивалентно статическому массиву C.

Ответ 3

В stdlib имеется стандартная функция:

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

Ответ 4

Обязательный совет: использовать std::vector<std::string>.

Функция, подобная этой, может помочь:

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

Ваш метод также работает, потому что размер элементов не меняется - a std::string имеет постоянный размер, независимо от фактической строки, которую он держит.

Ответ 5

Вы все еще можете использовать

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

Это потому, что sizeof(array) вернет сумму размеров указателей, соответствующих каждой строке. sizeof(array[0]) вернет размер указателя, соответствующего первой строке. Таким образом, sizeof(array)/sizeof(array[0]) возвращает количество строк.

Ответ 6

Мы можем найти количество элементов массива, просто используя функцию 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

Надеюсь, это поможет вам.

Ответ 7

Это то, что вы ищете?

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();
}

Ответ 8

Вот другой пример:

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