矢量和合并

时间:2018-02-18 19:29:25

标签: c++ vector merge

对于这个向量和合并赋值,我们应该读入用户输入的字符串并按字母顺序对它们进行排序。我得到了前两个部分,但是当我将已排序的元素放入新的向量中时,它表示我的新向量超出了范围。有谁知道如何解决这一问题?

#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;
}

2 个答案:

答案 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));
    }
}

没有做你期望的事。

据我所知,您的想法是合并que1que2中的剩余元素。

但是,这不是您从此代码中获得的内容,因为que1que2中的元素永远不会被删除。换句话说 - 检查空队列是没有意义的,您无法确定所有元素都已添加到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