我需要获取一个可能包含大量元素的 C++ 向量,删除重复项,然后对其进行排序。
我目前有以下代码,但它不起作用。
vec.erase(
std::unique(vec.begin(), vec.end()),
vec.end());
std::sort(vec.begin(), vec.end());
我怎样才能正确地做到这一点?
此外,首先删除重复项(类似于上面的代码)还是先执行排序更快?如果我先执行排序,是否保证在之后保持排序std::unique
被执行?
或者是否有另一种(也许更有效)的方法来完成这一切?
我同意R. Pate and 托德·加德纳; a std::set这里可能是个好主意。即使您被困在使用向量中,如果您有足够的重复项,您最好创建一个集合来完成这些肮脏的工作。
让我们比较一下三种方法:
只需使用向量、排序+唯一
sort( vec.begin(), vec.end() );
vec.erase( unique( vec.begin(), vec.end() ), vec.end() );
转换为集合(手动)
set<int> s;
unsigned size = vec.size();
for( unsigned i = 0; i < size; ++i ) s.insert( vec[i] );
vec.assign( s.begin(), s.end() );
转换为集合(使用构造函数)
set<int> s( vec.begin(), vec.end() );
vec.assign( s.begin(), s.end() );
以下是随着重复项数量变化它们的表现:
Summary:当重复的数量足够多时,实际上,转换为集合然后将数据转储回向量会更快.
由于某种原因,手动进行集合转换似乎比使用集合构造函数更快——至少在我使用的玩具随机数据上是这样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)