Как я могу найти размер определенных членов массива. Например, я объявил свой массив с этим:
string myStrArray[200] = {
"My first string",
"My second string",
"My last string"}
В этом коде есть 197 неиспользуемых элементов (или я так понимаю). Я хочу найти определенные элементы этого массива (3 элемента) с помощью кода, такого как размер(). Как я могу это сделать?
Ты не можешь. Тем не менее, вы можете сначала обнулить массив, а затем сосчитать количество ненулевых элементов, но для этого потребуется, чтобы массив содержал 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
Там нет никакого способа (по крайней мере в C ++, что я знаю), чтобы прочитать, сколько элементов в массиве определяется. Вы должны сделать это своей собственной переменной (увеличивать, когда вы «добавляете» элементы, и уменьшать, когда «удаляете»). Вы также можете использовать std :: vector. vector.size () возвращает размер вектора.
Если вы точно знаете, что все непустые строки находятся в начале, вы можете использовать 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, "");
Вы не можете использовать 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;