您想要的是只读访问而不复制整个数据块。你有几个选择。
首先,您可以只返回一个对您的数据容器的 const 引用,就像上面建议的那样:
const std::vector<T>& getData() { return mData; }
这有具体的缺点:你不能改变你在内部存储数据的方式而不改变你的类的接口。
其次,您可以返回指向实际数据的 const 指针:
const T* getDataAt(size_t index)
{
return &mData[index];
}
这更好一点,但也需要您提供 getNumItems 调用,并防止索引越界。此外,您的指针的 const-ness 很容易被抛弃,您的数据现在是可读写的。
另一种选择是提供一对迭代器,这有点复杂。这具有与指针相同的优点,并且不需要(必然)需要提供 getNumItems 调用,并且需要更多的工作来去除迭代器的 const 特性。
管理此问题的最简单方法可能是使用 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());
}
这具有范围可组合、可过滤等优点,正如您在 website 上看到的那样。