你如何将迭代器作为hash_map的键?

时间:2011-09-29 15:08:53

标签: c++ visual-studio-2010 gcc

如何将迭代器作为hash_map的键?
你会如何在gcc,Microsoft c ++下定义它?

E.g。

    vector<string>::iterator i;
    hash_map<vector<string>::iterator, int> h;

    list<string>::iterator i;
    hash_map<list<string>::iterator, int> h;

这会产生错误,因为迭代器未预定义为字符串,其他类型为...

  

块引用

3 个答案:

答案 0 :(得分:4)

存储向量的迭代器并不是一个好主意,因为向量的迭代器是不稳​​定的,即它们在insertremove,{{1 }},resize等等(参见Iterator invalidation rules)。

平原指数在这方面更安全:

push_back

您可以通过以下方式将索引转换为迭代器:

hash_map<size_t, int> h;

迭代器返回索引:

size_t index = ...
std::vector<std::string> vec(...);
std::vector<std::string>::iterator i = vec.begin() + index;

答案 1 :(得分:2)

FWIW:

以这种方式使用迭代器并不健壮。迭代器在对容器起作用的某些操作上失效。从那一刻起,您的hash_map键将失效。

我建议使用

hash_map<string, int> h;

vector<string*> i;
hash_map<string*, int> h;

甚至

vector<shared_ptr<string> > i;
hash_map<shared_ptr<string>, int> h;

答案 2 :(得分:1)

如果您知道自己在做什么(例如,如果迭代器是从不可修改的容器中获取的),您可以尝试利用&*it对于每个元素应该是唯一的这一事实:

typedef std::string my_container;
typedef my_container::const_iterator my_iterator;

struct IteratorHasher
{
  std::size_t operator()(const my_iterator & it) const
  {
    return hasher(&*it);
  }
private:
  std::hash<const char *> hasher;
};

用法:

int main()
{
   std::unordered_map<my_iterator, int, IteratorHasher> mymap;

   std::string hello("hello");
   mymap[hello.begin()] = 3;
}