为什么我们不能在下面的代码中使用方括号?


vector<int> mergeKSortedArrays(vector<vector<int>*> input) {
vector<int> ans;
//min priority queue
priority_queue<int, vector<int>, greater<int>> pq;
for(int i = 0; i < input.size(); i++){
for(int j = 0; j < input[i] -> size(); j++){
pq.push(input[i][j]); //THIS LINE
}
}
while(!pq.empty()){
ans.push_back(pq.top());
pq.pop();
}
return ans;
}

调用该函数的主函数mergeKSortedArrays

int main() {
int k;
cin >> k;
vector<vector<int> *> input;
for (int j = 1; j <= k; j++) {
int size;
cin >> size;
vector<int> *current = new vector<int>;
for (int i = 0; i < size; i++) {
int a;
cin >> a;
current->push_back(a);
}
input.push_back(current);
}
vector<int> output = mergeKSortedArrays(input);
for (int i = 0; i < output.size(); i++) {
cout << output[i] << " ";
}
return 0;
}

有谁能告诉我为什么在第一个循环中使用input[i][j]会出错吗?我所知道的方括号是如何工作的,它只是去地址和解引用。所以我不明白为什么使用方括号会有问题。输入[i]将我带到向量指针,然后输入[i][j]将我带到该向量的地址并解引用。如输入[i][j] =*(向量地址+ j)。还有一件事,我可以输入[i] ->在(j)。它的编译没有问题。但不不输入[我][j]与[我]→在(j),除非我正在对内存进行非法访问。

声明如下:

vector<vector<int>*> input;

input不是int向量的向量但它是指向int向量的指针的向量

所以你需要这个:(*input[i])[j]

  • input[i]是一个指针指向vector<int>
  • *input[i]vector<int>
  • (*input[i])[j]int

也就是说,首先不应该使用指针,而应该直接使用vector<vector<int>>(int vector的vector)。然后你可以使用input[i][j]

完整代码:

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
vector<int> mergeKSortedArrays(vector<vector<int>> input) {
vector<int> ans;
//min priority queue
priority_queue<int, vector<int>, greater<int>> pq;
for (int i = 0; i < input.size(); i++) {
for (int j = 0; j < input[i].size(); j++) {
pq.push(input[i][j]); //THIS LINE
}
}
while (!pq.empty()) {
ans.push_back(pq.top());
pq.pop();
}
return ans;
}
int main() {
int k;
cin >> k;
vector<vector<int>> input;
for (int j = 1; j <= k; j++) {
int size;
cin >> size;
vector<int> current;
for (int i = 0; i < size; i++) {
int a;
cin >> a;
current.push_back(a);
}
input.push_back(current);
}
vector<int> output = mergeKSortedArrays(input);
for (int i = 0; i < output.size(); i++) {
cout << output[i] << " ";
}
return 0;
}

注:
这段代码可以编译,但是我没有检查它是否真的像你想的那样工作。

奖金:
mergeKSortedArrays的签名应该是

vector<int> mergeKSortedArrays(const vector<vector<int>> & input)`

这将避免在调用mergeKSortedArrays时不必要地复制vector。

希望用一个简单的例子来说明vector<vector<int>>vector<vector<int>*>的区别

#include <vector>
#include <iostream>
int main(){
std::vector<int> v0 = {1, 2, 3};
std::vector<int> v1 = {1, 2, 3};
std::vector<std::vector<int>> vv = {v0, v1};
std::vector<std::vector<int> *> vpv = {&v0, &v1};
v0[0] = 4;
v0[1] = 5;
v0[2] = 6;
std::cout
<< ' ' << v0[0] 
<< ' ' << v0[1]
<< ' ' << v0[2]
<< ' ' << v1[0] 
<< ' ' << v1[1]
<< ' ' << v1[2]
<< "n" 
<< ' ' << vv[0][0] 
<< ' ' << vv[0][1]
<< ' ' << vv[0][2]
<< ' ' << vv[1][0] 
<< ' ' << vv[1][1] 
<< ' ' << vv[1][2] 
<< "n"
<< ' ' << vpv[0][0][0] 
<< ' ' << vpv[0][0][1]
<< ' ' << vpv[0][0][2]
<< ' ' << vpv[1][0][0] 
<< ' ' << vpv[1][0][1]
<< ' ' << vpv[1][0][2]
<< "n"; }

打印结果为:

4 5 6 1 2 3
1 2 3 1 2 3
4 5 6 1 2 3

相关内容

  • 没有找到相关文章

最新更新