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