2010-08-22 1 views
0

У меня есть stl unordered_map, и я хотел бы хранить ссылки на элементы на этой карте. Я бы хотел, чтобы не было дублирующих ссылок. Я думал, что могу создать набор итераторов, указывающих на элементы. Для одного я не был уверен, что это узнает, но даже в этом случае у меня были некоторые длинные ошибки шаблона, которые, по-моему, сводились к тому, что для итераторов не было оператора сравнения <.STL набор итераторов карт

Затем я попробовал неупорядоченный набор компиляции с 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; 
} 

ответ

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.

Осторожно с недействительностью итератора.

+0

Отлично подходит для компиляции. Думаю об этом. Есть много полезных алгоритмов набора, таких как пересечение, которые я могу использовать напрямую и просто с нормальным набором. Есть ли какая-либо функция сравнения, которую я могу реализовать, чтобы я мог использовать их, не заботясь о заказе. – zenna