Имеется тип string
из std
, нужно узнать длину массива этого типа.
std::string arrayT [] = {"value1", "value2", "value3"};
std::cout << sizeof (arrayT) << std::endl;
Всегда возвращает 8, независимо от кол-ва ключей/значений.
Есть другие варианты?
Оригинальный код:
string arrayT [] = {"value1", "value2", "value3", "value4", "value5", "value6"};
json.setString (arrayT, "testValue");
void JSON::setString (string key [], string value)
{
std::wcout << sizeof (key) << std::endl;
}
Вывод: 8
Совершенно не важно какого типа у вас массив. Для выяснения количества элементов любого массива достаточно поделить общий размер массива в байтах на размер отдельного элемента:
sizeof(array) / sizeof(element);
Чтобы явно не указывать в этом выражении тип элемента можно использовать либо оператор разыменования *
, или указать элемент по индексу (обычно используют 0
):
sizeof(array) / sizeof(*array);
sizeof(array) / sizeof(array[0]);
Видно, что вариант с разыменованием самый лаконичный.
Чтобы, тем не менее, не повторять это деление компилятор от Microsoft предоставляет для этих целей макрос _countof
:
_countof(array);
Если не хочется использовать макросы (а их лучше НЕ использовать, если есть такая возможность), то можно написать шаблонную функцию, принимающую ссылку на массив:
template <typename T, std::size_t N>
constexpr std::size_t countof(T const (&)[N]) noexcept
{
return N;
}
В с++17 для этих целей появилась функция std::size
:
std::size(array);
Проблема с выводом 8
в коде заключается в том, что при передаче в функцию массив вырождается в указатель и таким образом sizeof
даёт размер указателя. Именно поэтому часто приходится наблюдать передачу пары аргументов - указатель и размер данных по этому указателю.
Хотите иметь возможность сохранять размер - используйте std::array
или std::vector
при передаче в функцию. Тогда всегда сможете вызвать для них функцию-член size
или упомянутую выше std::size
, если компилятор позволяет.
sizeof - это унарный оператор, возвращающий длину в байтах переменной или типа, помещенных в скобки. Можно сделать так:
std::string arrayT [] = {"value1", "value2", "value3"};
std::cout << (sizeof(arrayT)/sizeof(*arrayT)) << std::endl;
return 0;
Разделите размер массива на размер std::string
и узнаете длину массива.
#include <iostream>
int main()
{
std::string arrayT [] = {"value1", "value2", "value3"};
size_t arrSize = sizeof(arrayT) / sizeof(std::string);
std::cout << arrSize << std::endl;
return 0;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Даны два массива целых чисел одинаковой длины A[0n−1] и B[0
Есть вектор целых чиселНужно только с помощью стандартных алгоритмов STL заменить каждый пятый элемент на 0
Доброго времени суток, помогите решить задачуСделал скрипт на лендинге который по кнопке отправляет товар к корзину
Добрый деньНужно сделать анимацию, что бы при наведении на блок поднималась нижняя полоска заливая его фоном