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
相关产品推荐
相关产品推荐

