C++中指向vector的指针用[]取值存入优先队列为什么报错?
报错原因解析
编译报错的本质是变量类型不匹配,和vector本身的[]访问能力无关,问题出在对指针类型的运算符语义理解有误。
核心变量类型说明
代码中v的类型是vector<int>*,即指向vector
- 错误写法
pq.push(v[0]):指针的[]运算符语义是数组偏移取值,v[0]等价于*(v + 0),取到的结果是vector<int>类型的对象,而你定义的优先队列要求存储int类型元素,编译器检测到类型不匹配就会报错。 - 正确写法
pq.push(v->at(0)):->是指针成员访问运算符,语义是先解引用指针拿到vector实例,再调用vector的at()成员方法取下标为0的元素,返回值是int类型,和优先队列的元素类型匹配,因此可以正常运行。
用[]访问vector元素的正确写法
如果想要用[]运算符访问vector的元素,需要先手动解引用指针,注意运算符优先级,必须加括号:
pq.push((*v)[0]); // 先解引用指针拿到vector对象,再调用vector的[]运算符
补充说明:vector的[]运算符和at()方法的区别是at()会做下标越界检查,越界时主动抛出异常,而[]不会做越界检查,越界访问属于未定义行为。
关联问题代码:
#include <iostream> using namespace std; #include <vector> #include <queue> int main(){ vector<int> *v = new vector<int>; v -> push_back(1); //min priority queue priority_queue<int, vector<int>, greater<int>> pq; pq.push(v[0]); //Able to do pq.push(v -> at(0)) }
内容的提问来源于stack exchange,提问作者AK_06
相关产品推荐
相关产品推荐

