对于这个向量和合并赋值,我们应该读入用户输入的字符串并按字母顺序对它们进行排序。我得到了前两个部分,但是当我将已排序的元素放入新的向量中时,它表示我的新向量超出了范围。有谁知道如何解决这一问题?
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<string> que1;
vector<string> que2;
vector<string> que_merge;
string firstName;
string secondName;
int counterq1 = 0;
int counterq2 = 0;
cout << "Enter queues: " << endl;
bool check = true;
while(check) {
cin >> firstName;
if (firstName == "ENDQ"){
check = false;
}
else{
que1.push_back(firstName);
counterq1++;
check = true;
}
}
// que1.resize(counterq1);
bool check2 = true;
while (check2) {
cin >> secondName;
if (secondName == "ENDQ") {
check2 = false;
} else {
que2.push_back(secondName);
counterq2++;
}
}
// que2.resize(counterq2);
cout << "que1: " << counterq1 << endl;
for (int i = 0; i < que1.size(); i++) {
cout << que1.at(i) << endl;
}
cout << endl;
cout << "que2: " << counterq2 << endl;
for (int j = 0; j < que2.size(); j++) {
cout << que2.at(j) << endl;
}
cout << endl;
cout << "que_merge: " << counterq1 + counterq2 << endl;
int i = 0;
int k = 0;
int j = 0;
while (1){
if (i >= counterq1 || j >= counterq2){
break;
}
if(que1.at(i) < que2.at(j)){
que_merge.push_back(que1.at(i));
i++;
}
else{
que_merge.push_back(que2.at(j));
j++;
}
k++;
}
if (que1.empty()){
for (int m = j; m < counterq2; m++){
que_merge.push_back(que2.at(m));
}
} else {
for (int l = i; l < counterq1; ++l) {
que_merge.push_back(que1.at(l));
}
}
for (int l = 0; l < (counterq1+counterq2); l++) {
cout << que_merge.at(l) << endl;
}
return 0;
}
答案 0 :(得分:0)
我认为你的问题是这些问题:
if (que1.empty()){
for (int m = j; m < counterq2; m++){
que_merge.push_back(que2.at(m));
}
} else {
for (int l = i; l < counterq1; ++l) {
que_merge.push_back(que1.at(l));
}
}
没有做你期望的事。
据我所知,您的想法是合并que1
或que2
中的剩余元素。
但是,这不是您从此代码中获得的内容,因为que1
和que2
中的元素永远不会被删除。换句话说 - 检查空队列是没有意义的,您无法确定所有元素都已添加到que_merge
所以当你这样做时:
for (int l = 0; l < (counterq1+counterq2); l++) {
cout << que_merge.at(l) << endl;
}
您可以阅读que_merge
提示:
不要计算你自己的元素数量。请改用size()
(例如que_merge.size()
)。例如:
for (int l = 0; l < que_merge.size(); l++) {
cout << que_merge.at(l) << endl;
}
或基于范围的循环,如:
for (const auto& s : que_merge) {
cout << s << endl;
}
答案 1 :(得分:0)
#include <algorithm>
使用std :: merge和std :: sort,不一定按顺序。
如果作业说你不能用C ++的方式来做,你必须把它全部写出来,你可以用工程师的方式来做:找一个有用的例子,然后给它做准备。
此页面上有两种可能的std :: merge实现:All about C++ merge