You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 20:53:19