我从const字符串列表中编写一个文本文件,我需要避免重复(列表包含重复项)。这些数据结构中哪些更好(在性能方面)用于跟踪已写入的字符串,
map<string,bool>
set<string>
现在我要怎么做,
foreach(string in list)
if(not found in map/set)
write to file
insert to map/set
endif
end
或者有其他方法可以做到这一点吗?
答案 0 :(得分:3)
地图不包含重复键的条目,因此使用map<string,bool>
没有意义。这与性能无关。 std::set<std::string>
或std::unordered_set<std::string>
可以完成这项工作。这是一个例子:
std::vector<std::string> word_list = ....;
std::set<std::string> word_set;
for (const auto& s : work_list) // loop over words in word_list
{
if(word_set.insert(s).second) // attempt to insert: fails if s already in set
{
// insertion succeeded: write to file
}
}
答案 1 :(得分:1)
您可能会使用set<string>
获得性能提升,因为map<string,bool>
需要存储一个至少大小为1的其他bool值。根据分配器和std :: string的实现方式,这可能会导致在更大的内存消耗(想想allignment)和缓存未命中。在这里查看finding和inserting。
答案 2 :(得分:1)
如果您可以选择使用c ++ 11,我建议您使用unordered_set
,因为它应该比set
渐进地执行。如果这不是一个选项,请使用set
。没有理由使用map<string, bool>
来执行此任务。
答案 3 :(得分:0)
你真的不需要另一个容器,使用算法:
std::vector<std::string> list = ...
std::sort(list.begin(), list.end());
std::unique(list.begin(), list.end());
// alternatively, copy to your file without changing source vector
std::unique_copy(list.begin(), list.end(), std::ostream_iterator(out_stream));
无论您做什么,您都会获得 n.log 操作的复杂性(插入map / set * n项目)。地图/集合解决方案可为 2.n 内存提供 2.n.log 操作;使用算法可以通过 n + n.log 操作和 1.n 内存完成工作。