正确的合并语法

时间:2014-04-25 22:55:02

标签: c++ sorting vector merge

这个问题可能看起来很愚蠢,但我不明白如何将两个已排序的向量与std :: merge合并。

我使用cplusplus参考尝试了一些代码。

struct t
{
  t(int x):a(x){}
  int a;
};
bool operator<(const t& p,const t&b)
{
  return p.a<b.a;
}

 int main()
 {
  vector<t> a,b,c;
  a.push_back(t(10));
  a.push_back(t(20));
  a.push_back(t(30));
  b.push_back(t(1));
  b.push_back(t(50));
  merge(a.begin(),a.end(),b.begin(),b.end(),c.begin());
  return 0;
 }

此代码存在分段错误。

1 个答案:

答案 0 :(得分:3)

你需要确保c足够大或增长:

std::merge(a.begin(),a.end(),b.begin(),b.end(),std::back_inserter(c));

可替换地:

c.resize(a.size() + b.size());
std::merge(a.begin(),a.end(),b.begin(),b.end(),c.begin());

查看 Live On Coliru

#include <algorithm>
#include <vector>
#include <iterator>
struct t
{
    t(int x):a(x){}
    int a;
};
bool operator<(const t& p,const t&b)
{
    return p.a<b.a;
}

int main()
{
    std::vector<t> a,b,c;
    a.push_back(t(10));
    a.push_back(t(20));
    a.push_back(t(30));
    b.push_back(t(1));
    b.push_back(t(50));
    std::merge(a.begin(),a.end(),b.begin(),b.end(),std::back_inserter(c));
    return 0;
}