连接两个大型QVector并对它们进行排序的最快方法(C ++ / Qt)

时间:2016-02-09 06:12:16

标签: c++ qt sorting concatenation qvector

在一个大型QVector中连接两个已经排序的大QVector的最佳(最快)方法是什么?

我有以下代码:

class Square
{
    .....
    qint32 id; //public
    .....
}

QVector <Square> v_one; //size 10000+
QVector <Square> v_two; //size 10000+

我已将v_onev_two排序为“id”。

如何执行 FAST 将这两个向量合并到其中一个(例如v_one = v_one + v_two)并按 id 进行排序。< / p>

我认为我必须将此作为一个动作(排序和合并),而不是一个接一个?

谢谢!

1 个答案:

答案 0 :(得分:3)

如果你想将它们合并到两个向量中的一个,我建议std::inplace_merge

auto size_one = v_one.size();
v_one += v_two;
std::inplace_merge(v_one.begin(), v_one.begin() + size_one, v_one.end(), 
  [](Square const &a, Square const &b) -> bool
  { return a.id < b.id; });

对于并行执行:实验C++ Extensions for Parallelism, ISO/IEC TS 19570:2015具有std::experimental::parallel::inplace_merge,这可能是将来某个时候标准的一部分。您可以在implementation for the parallel merge algorithms中找到CodePlex Parallel STL project,这是Microsoft并行扩展的原型。

编辑:

使用std::unique可以实现删除重复项。

auto new_end = std::unique(v_one.begin(), v_one.end(), 
  [](Square const &a, Square const &b) -> bool
  { return a.id == b.id; });
v_one.erase(new_end, v_one.end());