Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向量与合并_C++_Vector_Merge - Fatal编程技术网

C++ 向量与合并

C++ 向量与合并,c++,vector,merge,C++,Vector,Merge,对于这个向量和合并赋值,我们应该读入用户输入的字符串并按字母顺序排序。我得到了前两部分,但是当我把排序后的元素放入新向量时,它说我的新向量超出了范围。有人知道如何解决这个问题吗 #include <iostream> #include <vector> using namespace std; int main() { vector<string> que1; vector<string> que2; vector&

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

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

我认为您的问题在于以下几行:

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));
    }
}
您可以读取超过que_merge中元素数的内容

提示:

不要计算你自己的元素数量。改为使用像queu_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;
}
使用std::merge和std::sort,但不一定按那个顺序

如果赋值表示你不能用C++的方式,你必须把它全部写出来,你可以用工程师的方式来做:找到一个例子来工作,并把它记录下来。


本页上有两种可能的std::merge实现:

请将所有代码缩进4个空格。为什么要合并循环?为什么不把两个向量都放在新向量的末尾呢?如果你想对元素进行排序,那么一旦你合并了向量,就会出现重复。或者如果你不想重复,就会出现重复。为什么要计算向量中元素的数量?只需使用vector.sizeNo need for reference&在基于for循环的范围内。@JiveDadson Correct-不需要它,因为代码将在不使用reference的情况下产生相同的结果。但是,根据编译器和代码的优化方式,它可能会产生性能差异。在没有引用的情况下,每个元素可能都有一个副本。
for (const auto& s : que_merge) {
    cout << s << endl;
}
#include <algorithm>