更快的字符串比较排序,用于唯一()
faster string comparison for sorting, for unique()
我有 4e7std::string
,每个大约 3 到 30 个字符长,有很多重复项。 我把它们放在一个std::set
.
为每个字符串调用set::insert
在完成大约 1e7 个唯一字符串之前会变得非常缓慢。 因此,我将每个字符串push_back
到一个vector
中,sort()
并unique()
,然后将字符串移动到set
中。
它仍然很慢,但至少它完成了:4 秒来积累矢量,sort()
多 30 秒,unique()
多 3 秒。
瓶颈是sort()
.但我不需要按字典顺序对字符串进行排序!我只需要重复的字符串是连续的,为了unique()
. 他们的顺序无关紧要。 是否有更简单、更快的字符串比较函数可用于sort()
,而不是默认函数?
或者我应该通过迭代带有哈希表的向量来更快地构建集合,以跳过重复项? 或者用hash_set
或unordered_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()));
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 何时在引用或唯一指针上使用移动语义
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 更快的字符串比较排序,用于唯一()
- 唯一/共享 ptr 用于在数组超出范围后自动删除阵列
- 我的递归算法中的问题,用于查找所有最短、唯一的路径
- 用于插入 std::unordered_set 的 3D 间坐标的唯一键
- 标准容器/库,用于存储数字窗口并返回唯一数字的数量
- 方法,用于在代码中唯一标识方法调用,以测试调用序列是否未更改
- 用于存储唯一<键,值>元组的数据结构,其中<value>最小值
- C++数据结构,用于存储两组唯一元素之间的多个关系
- 在一个数组c++中授予唯一值我的代码并不适用于所有情况
- 用于构建高效哈希表的字符串的唯一属性
- 枚举用于多个文件,或多个文件的自动唯一常量
- c++,自己实现的唯一的用于排序向量的指针
- 用于查找具有最唯一值的'n'集的伪代码或算法?