Вам нужен доступ только для чтения без копирования всего большого объема данных. У вас есть пара вариантов.
Во-первых, вы можете просто вернуть const-ссылку на то, чем является ваш контейнер данных, как предложено выше:
const std::vector<T>& getData() { return mData; }
Это имеет недостаток конкретности: вы не можете изменить внутреннее хранение данных без изменения интерфейса вашего класса.
Во-вторых, вы можете вернуть константные указатели к фактическим данным:
const T* getDataAt(size_t index)
{
return &mData[index];
}
Это немного приятнее, но также требует, чтобы вы обеспечивали вызов getNumItems и защищали от выходящих за пределы индексов. Кроме того, постоянство ваших указателей легко отбрасывается, и ваши данные теперь доступны для чтения и записи.
Другой вариант - предоставить пару итераторов, что немного сложнее. Это имеет те же преимущества указателей, что и необязательно (необязательно) предоставлять вызов getNumItems, и требуется значительно больше работы, чтобы лишить итераторы их константности.
Вероятно, самый простой способ справиться с этим - использовать Boost Range:
typedef vector<T>::const_iterator range_iterator_type;
boost::iterator_range< range_iterator_type >& getDataRange()
{
return boost::iterator_range(mData.begin(), mData.end());
}
Преимущества диапазонов в том, что они можно компоновать, фильтровать и т. Д., Как вы можете видеть на сайте .