将两个向量中的元素按字母顺序排列到一个向量中

时间:2015-03-12 00:52:57

标签: c++ string vector alphabetical

用户输入的两个向量将始终按字母顺序排列,函数merge_items将这些值放在一个向量中,通过使用<运算符,代码最初给出了分段错误,并且在某些时候,它不显示最后一个元素。

#include <iostream>
#include <string>
#include <vector>

using namespace std;

void merge_items(vector<string>& a1,vector<string>& b1,vector<string>& merged);

int main(){
vector<string> v1,v2;
string a,b;
int n1,n2;
cout << "How many values for v1? " << endl;
cin >> n1;
for(int i = 0;i < n1;i++){
    cin >> a;
    v1.push_back(a);
}
cout << "How many values for v2? " << endl;
cin >> n2;
for(int i = 0;i < n2;i++){
    cin >> b;
    v2.push_back(b);
}

vector<string> merge;

merge_items(v1, v2, merge);

for(int i = 0;i < merge.size();i++){
    cout << merge[i] << endl;
}

return 0;
}

void merge_items(vector<string>& a1,vector<string>& b1,vector<string>& merged){         int i1 = 0,i2 = 0;
string temp;
while(i1+i2 < (a1.size()-1+b1.size()-1)){
    if(a1[i1] < b1[i2]){
        temp = a1[i1];
        merged.push_back(temp);
        i1++;

    }else{
        temp = b1[i2];
        merged.push_back(temp);
        i2++;

    }
}
}

1 个答案:

答案 0 :(得分:2)

这是合并的合适方式:

std::merge(a1.begin(), a1.end(),
           b1.begin(), b1.end(),
           std::back_inserter(merged));

至于你的解决方案有什么问题。几件事。

首先,一旦到达两个向量之一的末尾,就需要停止与该向量进行比较,只需复制从另一个向量中留下的任何元素。因此,您需要将i1a1.size()进行比较,与i2b1.size()的比较分开。根据您现在正在做的事情,当您到达一个向量的末尾时,您将继续比较该向量中的越界元素,这是未定义的行为,并且可能是您的分段错误的原因。

其次,你不需要从向量的大小中减去1。你做这件事的方式会给你一个合并的向量,它比源向量的组合大小少2个元素。