2016-12-17 2 views
1

У меня есть доступ к массиву, а не к вектору.Правильный способ отметить конец массива

Скажите, что мне может нужен массив из 100 объектов, но это может быть меньше. Если это меньше, есть ли элегантный способ отметить этот момент, чтобы его знали, что остальные объекты не требуются?

Или мне нужно сохранить это в самом объекте? Нет эквивалента нулевого символа?

+2

Имейте массив указателей вместо этого и остановите сначала 'nullptr'? – GSerg

+2

@OP - Вы только что указали одну причину, почему массивы имеют проблемы. Если вы объявили массив из 100 объектов, у вас есть 100 объектов, нет «возможно, это может быть меньше». – PaulMcKenzie

+0

Какие объекты? Конечно, вы можете иметь массив 'int', а затем остановиться при первом значении' 0', когда вы перебираете их. :) – wally

ответ

0

Нет, это не означает, что конец массива в памяти. Существует «эквивалент нулевого символа». Это ваша обязанность следить за этим.

Одна из многих причин использования std::vector заключается в том, что вектор отслеживает это. Но поскольку, как вы сказали, у вас «есть доступ к массиву, а не к вектору», тогда вам решать, как выполнять обязанности вектора.

+0

Нулевое или нулевое значение, обозначающее конец массива, является буквальным эквивалентом нулевого символа для строки. Фактически, это общий шаблон (устраняемый с помощью 'std :: vector' или' std :: array'), чтобы пометить конец массива неизвестных длин указателей, используя 'nullptr'. Как вы говорите, в большинстве случаев предпочтительнее использовать 'std :: vector' или эквивалентную структуру данных с полем размера. –

+0

Одним из основных недостатков использования массива с нулевым завершением является то, что проверка размера является операцией O (n), и поскольку произвольный доступ не может быть безопасно выполнен без проверки размера, делая произвольный доступ также операцией O (n). –

3

Существует несколько возможных подходов.

Вы можете использовать значение контрольной суммы и поместить это значение в конец массива, подобно тому, как '\0' отмечает конец строки в стиле C. Проблема заключается в том, что вы должны быть уверены, что ваше значение часового никогда не произойдет в данных, которые вам нужно сохранить.

Вы можете переносить счетчик количества значений в массиве и передавать это значение функциям, относящимся к вашему массиву.

Вы можете создать указатель, который указывает один за последним элементом в массиве, и обработать массив как пару указателей: тот, который указывает на первый элемент, и тот, который указывает один за концом. Это совместимо с алгоритмами STL, поэтому, вероятно, это ваш лучший общий подход.

Смежные вопросы