更快的字符串比较排序,用于唯一()

faster string comparison for sorting, for unique()

本文关键字:用于 唯一 排序 字符串 比较      更新时间:2023-10-16

我有 4e7std::string,每个大约 3 到 30 个字符长,有很多重复项。 我把它们放在一个std::set.

为每个字符串调用set::insert在完成大约 1e7 个唯一字符串之前会变得非常缓慢。 因此,我将每个字符串push_back到一个vector中,sort()unique(),然后将字符串移动到set中。

它仍然很慢,但至少它完成了:4 秒来积累矢量,sort()多 30 秒,unique()多 3 秒。

瓶颈是sort().但我不需要按字典顺序对字符串进行排序!我只需要重复的字符串是连续的,为了unique(). 他们的顺序无关紧要。 是否有更简单、更快的字符串比较函数可用于sort(),而不是默认函数?

或者我应该通过迭代带有哈希表的向量来更快地构建集合,以跳过重复项? 或者用hash_setunordered_set替换set

编辑:我正在使用g ++ 4.8.4在Linux上构建,唯一的标志是-std=c++11 -O3

@Someprogrammerdude,@J.AntonioPerez,@KennyOstrom:std::unordered_set快6倍。发布答案,我会接受。 (此优惠可能在所有这些评论中丢失。

vector<string> v;
loop { v.push_back(my_string[i]; }

慢原版:

sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
set<string> noduplicates = set<string>(
make_move_iterator(v.begin()), make_move_iterator(v.end()));

比前面的代码块快 6 倍:

unordered_set<string> noduplicates =
unordered_set<string>(
make_move_iterator(v.begin()), make_move_iterator(v.end()));