объявление массива строк и определение количества элементов в нем (openFrameworks)

Я новичок в C ++. Я просто хочу объявить массив и найти его размер. Как мне это сделать? Я продолжаю получать количество символов или что-то в этом роде.

string vidArray[] = {"fingers.mov","motion_test.mov"};
int numVids = vidArray->size();

1

Решение

Прежде всего vidArray-> размер () сделанный вами звонок эквивалентен vidArray [0] .call () потому что массив — это не что иное, как указатель, указывающий на первый элемент, поэтому, вызывая vidArray-> size (), вы просто делаете: (* vidArray) .size ().

Такие старые массивы не имеют size (), однако существуют нежелательные хаки, основанные на макросах, чтобы получить счетчик массива:

#define COUNTOF(arr) (sizeof(arr) / sizeof(arr[0]))
COUNTOF(vidArray)

Это вернет вам размер массива, но это не очень хорошая вещь (Пояснения), поэтому я бы посоветовал вам использовать std :: vector, если вам нужно динамическое изменение размера:

std::vector<std::string> vid;
vid.push_back("fingers.mov");
vid.push_back("motion_test.mov");

size_t vidSize = vid.size();

Что вы также можете инициализировать этот путь с помощью Boost :: assign (Документация)

std::vector<std::string> vid;
vid += std::string("fingers.mov"),std::string("motion_test.mov");

Или повышение :: массив (Документация) если вам нужен массив, размер которого не может изменяться (то есть, как было сказано Уолтером в комментариях, если вы уже используете c ++ 11, вы можете использовать std :: array, который является boost :: array, но в стандартной библиотеке)

boost::array<std::string,2> vid = {std::string("fingers.mov"),std::string("motion_test.mov")};

size_t vidSize = vid.size();
2

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

Просто используйте

vector<string> s{"s1", "s2", "s3"};

для инициализации вашего «массива».

тогда вы можете использовать

s.size()

чтобы получить размер вектора.

4

Массивы распадаются на указатели на их первый элемент при передаче. Это происходит и в вашем случае — вы получаете string* и вы на самом деле вызываете функцию-член строки size(), Он возвращает количество символов, которые он содержит.

Чтобы сделать то, что вы хотите, разделите общий размер массива на размер одного элемента:

int numVids = sizeof(vidArray) / sizeof(string);
1

В C ++ массивы не являются объектами. У них нет таких методов, как size (). Вы вызываете метод size () первой строки в массиве, потому что адрес памяти массива также является адресом памяти его первой записи.

Когда вы хотите умный контейнерный класс, который ведет себя как массив, вы можете использовать станд :: вектор. Он поставляется с множеством удобных функций, включая функцию size ().

0

Как сказал @Philipp, вы должны предпочесть контейнеры, такие как stdd::vector по массиву в целом. Однако это не означает, что вы должны пропустить основы, поэтому лучше избегать библиотек, таких как STL, пока вы не изучите язык.

Чтобы получить размер массива, то есть количество элементов, используйте sizeof оператор, который возвращает размер массива в байтах:

int arr[10];
size_t element_count = sizeof arr / sizeof arr[0];

Обратите внимание, что если вы передаете массив функции, он распадается на указатель, поэтому это не сработает.

void foo(int arr[10]) {
// element_count == sizeof int*, oops
size_t element_count = sizeof arr;
}

В этом случае вам также необходимо передать размер массива в функцию.

void foo(int *arr, size_t size) {

}

Как только вы получите твердое представление об этом материале, предпочтите более безопасный и удобный контейнер, как vector, Он динамически растет по требованию, гарантирует, что элементы будут храниться в непрерывной памяти (например, в массиве), предоставляет методы безопасного доступа (при необходимости), такие как ::at()и вам не нужно беспокоиться о ручном управлении памятью.

0
По вопросам рекламы [email protected]