STL集映射迭代器

时间:2010-08-22 13:04:46

标签: c++ stl map iterator set

我有一个stl unordered_map,我想存储对该地图中元素的引用。我希望没有重复的参考。我以为我可以创建一组指向元素的迭代器。对于一个我不确定它会识别,但即使如此我得到一些长模板错误,我认为归结为没有比较运算符<对于迭代器。

然后我尝试使用g ++ -std = c ++ 0x进行无序集合编译,但得到了错误页面。

我如何实现这一目标?

#include <set>
#include <unordered_map>
#include <unordered_set>

int main() {

  typedef std::unordered_map<int, float> umap;
  umap my_map;

  umap::const_iterator itr;
  for (int i=0;i<10000000;i++) {
    my_map[i] = float(i);
  }

 umap::iterator my_it1 = my_map.find(43);
 umap::iterator my_it2 = my_map.find(44);
 umap::iterator my_it3 = my_map.find(44);


 std::unordered_set<umap::iterator> my_its;
 my_its.insert(my_it1); 
 my_its.insert(my_it2);
 my_its.insert(my_it3);

 return 0;
}

1 个答案:

答案 0 :(得分:3)

由于您试图将迭代器存储在无序集中,因此您不需要比较运算符,而是需要哈希函数。

我猜测,因为每个不同的迭代器都指向一个不同的键,你可以使用键的哈希值来散列迭代器。

struct iterator_hash
{
    size_t operator()(std::unordered_map<int, float>::const_iterator it) const 
    { 
        return std::hash<int>()(it->first); 
    }
};

并将无序集实例化为:

std::unordered_set<umap::iterator, iterator_hash> my_its;

unordered_set也需要一个相等的函数,但只要所有的迭代器都属于同一个operator==,迭代器拥有unordered_map就可以了。

小心使用迭代器失效。