2

QVector2 つの大きな既にソートされたものを 1 つの大きなソート済みに連結する最良の (最速の) 方法は何QVectorですか?

次のコードがあります。

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

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

v_one" "でv_two並べ替え済みですid

これらの 2 つベクトルv_one = v_one + v_twoid.

私はこれを1つのアクション(ソートとマージ)として、次々にではなく行う必要があると思いますか?

ありがとうございました!

4

1 に答える 1

3

それらを 2 つのベクトルのいずれかにマージする場合は、次のことをお勧めします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、将来的に標準の一部になる可能性があるものがあります。Parallelism Extension の Microsoft プロトタイプであるCodePlex Parallel STL プロジェクトで、並列マージ アルゴリズムの実装を見つけることができます。


編集:

重複を削除するには、 を使用し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());
于 2016-02-09T06:34:37.043 に答える