Если это так, мы можем предположить, что будет нулевой терминатор в конце массиваVector: это вектор-функция (Const вектор <T,Allocator> & x); просто взять адрес, где массив хранится
Vector: это вектор-функция (Const вектор <T,Allocator> & x); просто взять адрес, где массив хранится
ответ
vector
копия? конструктор не просто скопирует указатель на внутреннее хранилище вектора, он делает копию содержимого другого вектора (если он просто скопировал указатель, то изменения, сделанные для одного вектора, будут отражены в другом векторе, а как вы знаете, это не так, как ведет себя класс vector
.)
Кроме того, нет гарантии, что там что-то специальное, обозначающее конец внутреннего хранилища вектора. (И внутреннее хранилище не обязательно является массивом.) Чтобы определить конец вектора, используйте функцию size
, чтобы помочь определить наивысший разрешенный индекс для вектора или сравнить итератор с тем, который был возвращен end
. Не ищите ценность дозорного устройства, если вы не поместили ее сами, или ваша документация библиотеки вам не предложила.
Предположительно вы говорите о конструкторе std::vector<T>
. Это конструктор копирования , и он не принимает адрес массива, а const ссылается на другой вектор. Вам, поставщику этого другого вектора, не нужно добавлять завершающий нуль.
std::vector<int> mine;
std::vector<int> theirs(mine); // no particular change required for mine
«Определенный реализацией» является техническим термином в стандарте C++, что означает, что соответствующие реализации * должны * документировать, какой выбор они делают. Нет ничего в стандарте, чтобы запретить реализацию от прикрепления построенного по умолчанию элемента от конца вектора (предполагая, что 'T' является стандартным по умолчанию конструктивным - что означает« нулевой ограничитель »даже для пользовательских типов вообще?), но, безусловно, нет требования, что реализация предупреждает вас, что это не так. –
Хорошо, отметил. Каков термин, позволяющий реализации рисовать цветок мимо конца() итератора каждого вектора, но не требовать, чтобы они упоминали его где-нибудь? – wilhelmtell
Существует «неуказанный», что означает, что реализация выработала ряд приемлемых действий, но реализация не обязана вести себя последовательно или документировать свое поведение (чтобы каждый раз, когда она захотела, , Например, порядок оценки аргументов функции не указан. Для чего-то вроде этого, я думаю, я бы просто сказал, что стандарт не требует реализации * not *, чтобы нарисовать цветок. Я думаю, что было бы бессмысленно называть такие вещи неопределенными, но это неявно, а не какой-либо явный вывод неопределенного. –
Вектор не является массивом, и он не является нулевым, что является глупой вещью в богатом типе данных. –