Нахождение размера определенных элементов в массиве?

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

string myStrArray[200] = {
"My first string",
"My second string",
"My last string"}

В этом коде есть 197 неиспользуемых элементов (или я так понимаю). Я хочу найти определенные элементы этого массива (3 элемента) с помощью кода, такого как размер(). Как я могу это сделать?

2

Решение

Ты не можешь. Тем не менее, вы можете сначала обнулить массив, а затем сосчитать количество ненулевых элементов, но для этого потребуется, чтобы массив содержал string* скорее, чем string,

Вместо этого вы можете использовать вектор, например:

std::vector<std::string> v;
v.reserve(200); // Allocate space for 200
v.push_back("My first string");
v.push_back("My second string");
v.push_back("My last string");
v.size(); // Returns 3
4

Другие решения

Там нет никакого способа (по крайней мере в C ++, что я знаю), чтобы прочитать, сколько элементов в массиве определяется. Вы должны сделать это своей собственной переменной (увеличивать, когда вы «добавляете» элементы, и уменьшать, когда «удаляете»). Вы также можете использовать std :: vector. vector.size () возвращает размер вектора.

1

Если вы точно знаете, что все непустые строки находятся в начале, вы можете использовать std::find:

int n = std::find(myStrArray, myStrArray + 200, "") - myStrArray;

На самом деле, вы могли бы использовать std::lower_bound, который является бинарным поиском, и поэтому будет более эффективным, чем std::find, Но вам понадобится необычная функция сравнения. Тот, который возвращает true, если lhs не пуст, а rhs пуст, в противном случае — false.

Если непустые элементы распределены редко, вы можете использовать std::count:

int n = 200 - std::count(myStrArray, myStrArray + 200, "");
1

Вы не можете использовать sizeof (), чтобы узнать, сколько элементов «заполнено» в массиве, вы храните std :: string в массиве (я полагаю, по крайней мере), и все элементы будут одного размера (потому что std :: string не меняйте размер после инициализации). Никакие объекты не изменяют размер в C ++, по крайней мере, не в соответствии с sizeof (); sizeof () всегда будет возвращать один и тот же номер для типа, потому что он возвращает размер статического типа.

Если вы считаете, что позиция в массиве «заполнена», когда строка не равна «», то вы можете использовать следующий код для подсчета количества строк:

for (int i = 0; i < 200; ++i)
if (!myStrArray[i].empty()) ++count;

Я бы порекомендовал использовать std :: vector<> вместо этого (хотя это почти всегда лучшая идея):

std::vector<std::string> my_strings = { "a", "b" }; // requires C++11 in C++03 use push_back()
std::cout << "Number of strings: " << my_strings.size() << std::endl;
0
По вопросам рекламы [email protected]