map <key,bool> vs set <key>以跟踪密钥集合的唯一性</key> </key,bool>

时间:2013-06-26 07:45:32

标签: c++ data-structures map set

我从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

或者有其他方法可以做到这一点吗?

4 个答案:

答案 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)和缓存未命中。在这里查看findinginserting

答案 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 内存完成工作。