【发布时间】:2013-02-09 01:47:36
【问题描述】:
我有一个数据结构问题。我有一个字符串集合,这些字符串在进程的整个生命周期中都会增长。我希望能够在程序中以不同的持续时间传递对这些字符串的引用。我不想将重复项添加到集合中,因此当我传入一个时,我希望返回对现有条目的引用,因此:
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::string* 的std::set 对它们进行索引:谁能做得更好? 15 个字符串比较似乎很多。
【问题讨论】:
-
“我情不自禁地觉得这太不理想了” - 有时你可能会对乍一看似乎效率低下的算法的速度感到非常惊讶。也许这不是你的情况,但我想发布一个关于避免过早优化的免责声明:)
-
是的,您正在进行 (max) 15 次字符串比较,但您不会经常达到这个数字,其中许多只能比较一两个字符.
-
为什么要使用数组,为什么不只使用
std::set<std::string>? -
也许 trie 是你想要的,但我不知道 C++ 中的标准实现。
-
我同意 Dukeling 的观点,有一个额外的 Array 似乎没有必要,因为 std::set 不会使迭代器无效。 hash_set 也是如此(值得一试)。恕我直言,使用集合并不是过早的优化,它很聪明,因为 1. 它具有正确的语义。 2. 比较有效率。
标签: c++ sorting search stl containers