c++ - 高效的字符串字典

标签 c++ sorting search stl containers

我有一个数据结构问题。我有一个字符串集合,它在整个过程的生命周期中不断增长。我希望能够以不同的持续时间在程序周围传递对这些字符串的引用。我不想向集合中添加重复项,所以当我传入一个时,我希望返回对现有条目的引用,因此:

const std::string& add_new_entry(const std::string&)
{
    // Check if string exists
    // Return reference if it does
    // Otherwise add to collection
    // Return reference to it
}

最天真的实现是一个字符串列表和每次调用 std::find,但我不禁觉得这不是最理想的,特别是因为我正在向上处理50,000 个字符串。我创建了一个扩展数组容器,因此我可以任意添加元素而无需强制调整大小和移动,并且我使用 std::setstd::string*< 对它们进行索引 使用取消引用比较谓词按字母顺序排列:还有人能做得更好吗? 15 次字符串比较似乎很多。

最佳答案

摆脱O(log n) set的性能, 你可以使用 unordered_set 它使用散列(并且是 O(1) )(或 hash_set 本质上相同,但仅受某些编译器支持)。

鉴于您正在进行(最多)15 次字符串比较,您不会一直达到这个最大值,并且其中许多只能比较一个或两个字符,很有可能为 unordered_set 生成哈希(并处理哈希冲突)比在 set 中查找值花费的时间更长.

此外,为什么不去掉数组而只使用 std::set<std::string>反而?你仍然可以返回一个引用:

const string& add_new_entry(const string& str)
{
    set<string>::iterator iter = yourSet.find(str);
    if (iter == yourSet.end())
      return *yourSet.insert(str).first;
    return *iter;
}

Test .

关于c++ - 高效的字符串字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15041186/

相关文章:

c++ - 如何使函数在不同时间调用时返回不同的字符串? C++

c++ - AVX 256 位代码的性能略逊于等效的 128 位 SSSE3 代码

c++ - 通过应用程序确定 Windows 版本

php 使用下划线对文件名进行排序

unix - Unix shell 命令的一般语法是什么?

sql - 数据库中的汉明距离/相似性搜索

c++ - 在 WebSocket++ 中关闭连接后出错

algorithm - 何时可以使用数字索引进行排序的最佳方法?

ios - 使用未指定的索引。考虑添加 ".indexOn": "phone" at/use_frameworks_beta_2/searchIndex to your security rules for better performance

django - Django 模板中的搜索字段