如何获取std::vector中一段元素的const引用?(C++17及更低版本)
在C++17及更低版本中获取vector的const引用范围
因为标准容器无法直接存储引用类型(比如std::vector<const MyClass&>是非法的),我们可以通过迭代器范围或自定义轻量范围类来实现需求,既避免拷贝原对象,又能以const引用的方式访问指定区间的元素。
方法一:使用const迭代器对直接表示范围
利用C++11及以上支持的范围for循环,结合迭代器对来遍历指定区间,遍历过程中每个元素都是const引用:
#include <iostream> #include <vector> #include <utility> class MyClass { public: int data; MyClass(int val) : data(val) {} }; int main() { std::vector<MyClass> myClass{1, 2, 3, 4, 5, 6, 7, 8}; const auto &el = myClass[0]; const unsigned int start = 1, end = 4; // 区间为[start, end),对应索引1、2、3的元素 // 获取区间的const迭代器 auto range_begin = myClass.cbegin() + start; auto range_end = myClass.cbegin() + end; // 遍历区间,elem是const MyClass&类型 for (const auto& elem : std::make_pair(range_begin, range_end)) { std::cout << elem.data << " "; } return 0; }
方法二:自定义ConstRange类封装范围
如果需要更直观的范围对象,可以自定义一个轻量的范围类,封装const迭代器,让代码可读性更好:
#include <iostream> #include <vector> class MyClass { public: int data; MyClass(int val) : data(val) {} }; // 封装const迭代器的范围类 template <typename Iter> class ConstRange { public: ConstRange(Iter begin, Iter end) : begin_(begin), end_(end) {} // 提供begin/end方法,支持范围for循环 Iter begin() const { return begin_; } Iter end() const { return end_; } private: Iter begin_; Iter end_; }; // 辅助函数:快速创建ConstRange对象 template <typename Container> auto make_const_range(const Container& cont, size_t start, size_t end) { return ConstRange<typename Container::const_iterator>( cont.cbegin() + start, cont.cbegin() + end ); } int main() { std::vector<MyClass> myClass{1, 2, 3, 4, 5, 6, 7, 8}; const auto &el = myClass[0]; const unsigned int start = 1, end = 4; // 获取表示区间的ConstRange对象 auto elRange = make_const_range(myClass, start, end); // 遍历区间,elem是const MyClass&类型 for (const auto& elem : elRange) { std::cout << elem.data << " "; } return 0; }
注意事项
- 确保
start和end的合法性:start < end且end <= myClass.size(),否则会导致迭代器越界访问。 - 两种方法都不会拷贝原
MyClass对象,仅通过迭代器间接访问,符合只读需求且效率较高。
内容的提问来源于stack exchange,提问作者Mathieu
相关产品推荐
相关产品推荐

