Я знаю, что это довольно старый пост, но это один из лучших результатов Google при поиске "c ++ read only vector". Вот почему я все же хочу опубликовать свой подход.
Если вы хотите, чтобы сам контейнер был константным, но не его элементами, вы можете использовать подход, подобный этому:
template<class Container>
class Enumerable
{
public:
Enumerable(Container& container) : _container(container) {}
auto begin() const { return _container.begin(); }
auto end() const { return _container.end(); }
const Container& GetContainer() const { return _container; }
const Container* operator->() const { return &_container; }
private:
Container& _container;
};
С этим вы можете перебирать свой контейнер и изменять его элементы, сохраняя при этом тот же контейнер. Вы можете захотеть предоставить больше функциональных возможностей контейнера, специализируя класс, например, для векторы, предоставляя оператор индексации.
Я не совсем уверен, что это хороший дизайн для показа такого контейнера, но это определенно полезный шаблон для некоторых сценариев.