【问题标题】:STL set of map iteratorsSTL 映射迭代器集
【发布时间】:2011-04-02 06:40:20
【问题描述】:

我有一个 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;
}

【问题讨论】:

    标签: c++ stl map iterator set


    【解决方案1】:

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

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

    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。

    小心迭代器失效。

    【讨论】:

    • 这个编译很棒。想起来了。有很多有用的集合算法,比如交集,我可以直接简单地使用普通集合。有没有我可以实现的任意比较函数,这样我就可以在不关心排序的情况下使用它们。
    猜你喜欢
    • 2011-05-29
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    相关资源
    最近更新 更多