【发布时间】:2019-09-27 19:28:30
【问题描述】:
我需要使用合并排序对 2 个向量(A 和 B)进行排序,并将排序后的元素放入第三个向量 (R)。
在 A (1,3,5) 和 B 为 (2,4,6) 中的 3 个元素的测试中,我的代码运行正常,直到我必须插入第 4 个元素。此时我的代码因向量下标超出范围错误而崩溃。
这是我第一次使用向量,但我认为 push_back() 函数会调整向量的大小。我的预感是目标向量 (R) 只能容纳 3 个元素,所以当我插入第 4 个元素时,我的代码会崩溃。我需要做些什么来调整 R 的大小吗?
using namespace std;
#include <iostream>
#include <vector>
// combine two sorted lists A and B into R
// displays comparison every time it is done
void combine(vector<int> A, vector<int> B, vector<int>& R)
{
int ia = 1;
int ib = 1;
int ir = 1;
while (!A.empty() && !B.empty()) {
if (A[ia] < B[ib]) {
R.push_back(A[ia]);
ia++;
ir++;
}
else {
R.push_back(B[ib]);
ib++;
ir++;
}
}
if (!A.empty()) {
for (int i = ia; i < A.size(); i++) {
R.push_back(A[i]);
}
}
else if (!B.empty()) {
for (int i = ib; i < B.size(); i++) {
R.push_back(B[i]);
}
}
cout << "comparison" << endl;
// be careful -- R comes in as an empty vector
}
int main()
{
vector<int> L1;
vector<int> L2;
vector<int> L3;
int N; // how many elements in each of L1 and L2
int e; // for each element
cout << "How many elements in each list?" << endl;
cin >> N;
cout << "List1" << endl;
for (int i = 1; i <= N; i++)
{
cout << "element :"; cin >> e; L1.push_back(e);
}
cout << "List2" << endl;
for (int i = 1; i <= N; i++)
{
cout << "element :"; cin >> e; L2.push_back(e);
}
combine(L1, L2, L3);
cout << "The result is: ";
for (int i = 0; i < N * 2; i++)
{
cout << L3[i];
} cout << endl;
}// end of main
【问题讨论】:
-
在
combine中研究while循环的条件。循环中是否有任何东西会改变该条件的值? -
我建议你做一些rubber duck debugging 的
combine函数。尤其是在第一个循环中。想想A或B什么时候会变空。 -
记住向量索引是从零开始的。
-
最后,你确定是
L3.size() == N * 2吗?为什么不使用L3.size(),它保证是向量的确切大小。