2012-02-24 1 views
0

Если это так, мы можем предположить, что будет нулевой терминатор в конце массиваVector: это вектор-функция (Const вектор <T,Allocator> & x); просто взять адрес, где массив хранится

+2

Вектор не является массивом, и он не является нулевым, что является глупой вещью в богатом типе данных. –

ответ

2

vector копия? конструктор не просто скопирует указатель на внутреннее хранилище вектора, он делает копию содержимого другого вектора (если он просто скопировал указатель, то изменения, сделанные для одного вектора, будут отражены в другом векторе, а как вы знаете, это не так, как ведет себя класс vector.)

Кроме того, нет гарантии, что там что-то специальное, обозначающее конец внутреннего хранилища вектора. (И внутреннее хранилище не обязательно является массивом.) Чтобы определить конец вектора, используйте функцию size, чтобы помочь определить наивысший разрешенный индекс для вектора или сравнить итератор с тем, который был возвращен end. Не ищите ценность дозорного устройства, если вы не поместили ее сами, или ваша документация библиотеки вам не предложила.

0

Предположительно вы говорите о конструкторе std::vector<T>. Это конструктор копирования , и он не принимает адрес массива, а const ссылается на другой вектор. Вам, поставщику этого другого вектора, не нужно добавлять завершающий нуль.

std::vector<int> mine; 
std::vector<int> theirs(mine); // no particular change required for mine 
+1

«Определенный реализацией» является техническим термином в стандарте C++, что означает, что соответствующие реализации * должны * документировать, какой выбор они делают. Нет ничего в стандарте, чтобы запретить реализацию от прикрепления построенного по умолчанию элемента от конца вектора (предполагая, что 'T' является стандартным по умолчанию конструктивным - что означает« нулевой ограничитель »даже для пользовательских типов вообще?), но, безусловно, нет требования, что реализация предупреждает вас, что это не так. –

+0

Хорошо, отметил. Каков термин, позволяющий реализации рисовать цветок мимо конца() итератора каждого вектора, но не требовать, чтобы они упоминали его где-нибудь? – wilhelmtell

+0

Существует «неуказанный», что означает, что реализация выработала ряд приемлемых действий, но реализация не обязана вести себя последовательно или документировать свое поведение (чтобы каждый раз, когда она захотела, , Например, порядок оценки аргументов функции не указан. Для чего-то вроде этого, я думаю, я бы просто сказал, что стандарт не требует реализации * not *, чтобы нарисовать цветок. Я думаю, что было бы бессмысленно называть такие вещи неопределенными, но это неявно, а не какой-либо явный вывод неопределенного. –