#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))
}
Run Code Online (Sandbox Code Playgroud)
那么为什么会出现这个错误呢?我不是在优先级队列中推送一个整数吗?
std 向量已经动态管理其缓冲区。
99.9%的情况下,new std::vector都是一个错误。
vector<int> v;
v.push_back(1);
//min priority queue
priority_queue<int, vector<int>, greater<int>> pq;
pq.push(v[0]);
Run Code Online (Sandbox Code Playgroud)
这有效。
如果确实在 0.1% 的情况下,向量上的 new 有意义,请更改v[0]为(*v)[0].
所做v[0]的是将指针v视为指向向量数组的指针。然后它选择第 0 个。它不会选择第 0 个元素的第 0 个元素。 也可以工作(但是当实际上不是指向数组的指针v[0][0]时,这将是一个糟糕的方法;通常会让读者感到困惑)。v
因此,C++ 从 C 继承了数组指针对偶性。当你有一个指针时,你可以使用方括号将其视为数组,就好像它是指向数组第一个元素的指针一样。这实际上就是数组的[]工作原理;数组隐式转换为指针,然后[]应用。当您有一个不指向数组的指针时,这会令人困惑。
C++ 也有对象,这些对象可以重载方括号等运算符。重载发生在对象上,而不是发生在指向这些对象的指针上。
因此,vector[]假装是一个数组并找到该向量拥有的元素。 ptr_to_vector[]insteat 将其视为从 开始的向量数组*ptr_to_vector,几乎不是您想要的。
C++ 的相对独特之处在于拥有可以作为值的成熟对象。很少有语言能做到这一点。如果您来自其他语言,这可能会令人困惑。尽可能采用 C++ 中的值语义。