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

std::vector.at()返回引用还是副本?C++初学者的vector使用疑问

关于std::vector::at()返回值的疑问解答

嘿,很高兴看到你在深入探索std::vector的工作原理!先直接给你答案:std::vector::at()返回的是引用,但你的代码写法让它变成了副本,我来给你详细拆解一下。

核心结论

std::vector<T>::at(size_type pos)的返回值分两种情况:

  • 如果vector是非const的,返回T&(可修改的引用)
  • 如果vector是const的,返回const T&(只读引用)

它本身不会返回副本,但如果你的接收变量是值类型(比如你代码里的std::vector<int> var),就会触发vector的拷贝构造函数,把引用指向的元素复制一份到新变量里,这时候var就成了原元素的副本。

结合你的代码分析

你写的这段代码:

std::vector<int> var = lista.at(0);

这里lista.at(0)返回的是std::vector<int>&(指向lista中第一个vector元素的引用),但因为var是值类型(不是引用),C++会自动调用std::vector<int>的拷贝构造函数,创建一个全新的vector副本赋值给var。这意味着你后续对var的任何修改都不会影响原lista里的元素。

如果想直接操作原容器里的元素,避免不必要的拷贝,你应该用引用类型来接收:

// 只读引用(如果不需要修改原元素)
const std::vector<int>& var = lista.at(0);
// 或者可修改引用(如果需要修改原元素)
std::vector<int>& var = lista.at(0);

修改后的测试示例

给你调整后的代码,可以更直观看到区别:

#include <iostream>
#include <vector>
int main() {
    std::vector<int> element1 = { 1, 2, 3 };
    std::vector<int> element2 = { 4, 5, 6 };
    std::vector<std::vector<int>> lista = { element1, element2 };

    // 使用const引用接收,避免拷贝,只读原元素
    const std::vector<int>& var = lista.at(0);
    std::cout << "原lista第一个元素:";
    for (std::vector<int>::const_iterator i = var.begin(); i != var.end(); ++i)
        std::cout << *i << ' ';
    std::cout << std::endl;

    // 使用可修改引用,修改原元素
    std::vector<int>& var_ref = lista.at(0);
    var_ref[0] = 100; // 修改引用指向的原元素

    // 再次输出原lista的第一个元素,会看到修改后的结果
    std::cout << "修改后的lista第一个元素:";
    for (int num : lista.at(0))
        std::cout << num << ' ';
    std::cout << std::endl;
}

运行这段代码会输出:

原lista第一个元素:1 2 3 
修改后的lista第一个元素:100 2 3 

额外小提示

at()和operator[]的一个关键区别是:at()会做边界检查,如果传入的索引超出vector的范围,会抛出std::out_of_range异常;而operator[]不做边界检查,越界访问会导致未定义行为(比如程序崩溃)。所以在不确定索引是否合法时,优先用at()更安全。

内容的提问来源于stack exchange,提问作者VansFannel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:22:14