在一个大型QVector
中连接两个已经排序的大QVector
的最佳(最快)方法是什么?
我有以下代码:
class Square
{
.....
qint32 id; //public
.....
}
QVector <Square> v_one; //size 10000+
QVector <Square> v_two; //size 10000+
我已将v_one
和v_two
排序为“id
”。
如何执行 FAST 将这两个向量合并到其中一个(例如v_one = v_one + v_two
)并按 id
进行排序。< / p>
我认为我必须将此作为一个动作(排序和合并),而不是一个接一个?
谢谢!
答案 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());