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