【问题标题】:Vectors And Merging向量和合并
【发布时间】:2018-07-29 01:42:14
【问题描述】:

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

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

【问题讨论】:

  • 请将所有代码缩进4个空格
  • 为什么你的循环要“合并”?为什么不简单地将insert 两个向量都放在新向量的end 上?如果要对元素进行排序,则在合并向量后会出现std::sort
  • 或者如果你不想重复,总是有std::set_union
  • 为什么要统计向量中的元素个数?只需使用vector.size()

标签: c++ vector merge


【解决方案1】:

我认为你的问题是这些行:

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

【讨论】:

  • 在基于范围的 for 循环中无需引用 &amp;
  • @JiveDadson 正确 - 没有 需要 因为代码将在不使用引用的情况下产生相同的结果。但是,根据编译器和代码的优化方式,它可能会产生性能差异。如果没有参考,每个元素都可能有副本。
【解决方案2】:
#include <algorithm> 

使用 std::merge 和 std::sort,不一定要按这个顺序。

如果作业说你不能用 C++ 的方式来做,你必须把它全部写出来,你可以按照工程师的方式来做:找到一个有效的例子,然后把它写下来。

此页面上有两种可能的 std::merge 实现:All about C++ merge

【讨论】:

    猜你喜欢
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多