【问题标题】:Arranging elements from two vectors alphabetically into one vector将两个向量中的元素按字母顺序排列到一个向量中
【发布时间】:2015-03-12 00:52:57
【问题描述】:

用户输入的两个向量将始终按字母顺序排列,函数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++;

    }
}
}

【问题讨论】:

  • 可以直接推回a1[i1],不需要复制到局部变量中。我想这是一个练习,否则我会很想将两个向量附加到合并然后对其进行排序。
  • Merging vectors 的可能重复项

标签: c++ string vector alphabetical


【解决方案1】:

这是合适的合并方式:

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

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

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

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

【讨论】:

  • 酷我不知道合并功能。
  • 我们可以使用这个函数将两个源向量合并为一个源向量吗?如果没有,STL 是否有这样做的功能?谢谢
  • @RonTang:不,你不能,不,它没有。不过有std::inplace_merge,它允许您合并两个相邻的排序范围。换句话说,例如,如果您有一个前半部分已排序的向量,而后半部分已排序,您可以将它们合并,以便对整个向量进行排序。
猜你喜欢
  • 2014-10-24
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 2018-04-19
相关资源
最近更新 更多