Если вы спрашиваете, как инициализировать константный вектор, чтобы он имел интересное содержимое, то ответ, вероятно, будет заключаться в использовании конструктора копирования. Сначала вы кропотливо заполняете вектор, а затем создаете из него новый постоянный вектор. Или вы можете использовать шаблон конструктора vector<InputIterator>(InputIterator, InputIterator) для инициализации из другого типа контейнера или массива. Если это массив, то его можно было бы определить с помощью списка инициализации.
Надеюсь, что-то вроде этого близко к тому, что вы хотите:
const T ra[3] = {t1, t2, t3};
const vector<const T> v(ra, ra+3);
Если вы спрашиваете, как передать константный вектор в функцию, которая принимает вектор, то ответ будет либо:
- вы не можете, потому что функция может изменить вектор, а ваш объект/ссылка является константой. Сделайте непостоянную копию оригинала и передайте ее.
or
- используйте
const_cast, чтобы удалить константу, чтобы передать ее в функцию, которая принимает неконстантный вектор, но которая, как вы случайно знаете, не изменит вектор.
Последнее — одна из тех вещей, которые совершенно справедливо заставят любого, кто увидит это, комментировать очки и тот факт, что они ничего не делают. Это именно то, для чего нужен const_cast, но есть достаточно веский аргумент, говорящий, что если вам нужен const_cast, вы уже проиграли.
Выполнение обеих этих вещей (создание константного вектора из неконстантного с помощью конструктора копирования, а затем отбрасывание константности) определенно неправильно - вы должны были просто использовать неконстантный вектор. Так что выберите не более одного из них, чтобы сделать...
[Редактировать: только что заметил, что вы говорите о разнице между vector<T> и const vector<const T>. К сожалению, в STL типы vector<const T> и vector<T> совершенно не связаны друг с другом, и единственный способ преобразования между ними — копирование. В этом разница между векторами и массивами — T** можно тихо и безопасно преобразовать в const T *const *]
person
Steve Jessop
schedule
23.10.2008