用户输入的两个向量将始终按字母顺序排列,函数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++;
}
}
}
答案 0 :(得分:2)
这是合并的合适方式:
std::merge(a1.begin(), a1.end(),
b1.begin(), b1.end(),
std::back_inserter(merged));
至于你的解决方案有什么问题。几件事。
首先,一旦到达两个向量之一的末尾,就需要停止与该向量进行比较,只需复制从另一个向量中留下的任何元素。因此,您需要将i1
与a1.size()
进行比较,与i2
与b1.size()
的比较分开。根据您现在正在做的事情,当您到达一个向量的末尾时,您将继续比较该向量中的越界元素,这是未定义的行为,并且可能是您的分段错误的原因。
其次,你不需要从向量的大小中减去1。你做这件事的方式会给你一个合并的向量,它比源向量的组合大小少2个元素。