如何通过[]运算符访问std::unique_ptr<std::vector<int>>中的vector元素?
解决
std::unique_ptr<std::vector<int>>的元素访问问题 嘿,这个坑我之前踩过!你遇到的错误是因为std::unique_ptr本身并没有重载[]运算符——你直接写x[0]是在试图对智能指针对象本身使用下标,而不是它指向的vector容器,这当然会报错。
要正确访问内部vector的元素,你需要先获取到智能指针指向的vector对象,有几种常用方法:
方法1:解引用智能指针后使用[]
这是最直观的写法,用*解引用unique_ptr拿到底层的vector,再用[]访问元素:
(*x)[0] = 1;
方法2:用箭头运算符调用vector的operator[]
因为unique_ptr重载了->运算符,可以直接访问指向对象的成员/运算符,你也可以显式调用vector的operator[]:
x->operator[](0) = 1;
不过这种写法不如第一种简洁,实际开发中用得不多。
额外推荐:用at()做安全访问
如果想避免越界访问的未定义行为,推荐使用vector的at()方法,它会做边界检查,越界时抛出std::out_of_range异常:
x->at(0) = 1;
注意:一定要先初始化智能指针!
你的原代码里x是一个空的unique_ptr(没有指向任何有效的vector),哪怕你用了上面的正确写法,也会触发未定义行为(大概率程序崩溃)。所以必须先让它指向一个有效的vector,比如用std::make_unique初始化:
std::unique_ptr<std::vector<int>> x = std::make_unique<std::vector<int>>(5); // 初始化一个包含5个元素的vector
完整修正后的代码
#include <memory> #include <vector> int main() { // 初始化智能指针,指向一个有5个默认初始化元素的vector std::unique_ptr<std::vector<int>> x = std::make_unique<std::vector<int>>(5); // 方法1:解引用后用[] (*x)[0] = 1; // 方法2:显式调用operator[] x->operator[](1) = 2; // 安全访问:用at() x->at(2) = 3; }
内容的提问来源于stack exchange,提问作者cdn
相关产品推荐
相关产品推荐

