如何将迭代器作为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;
这会产生错误,因为迭代器未预定义为字符串,其他类型为...
块引用
答案 0 :(得分:4)
存储向量的迭代器并不是一个好主意,因为向量的迭代器是不稳定的,即它们在insert
,remove
,{{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;
}