STL набор итераторов карт - PullRequest
       27

STL набор итераторов карт

0 голосов
/ 22 августа 2010

У меня есть 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 Ответ

3 голосов
/ 22 августа 2010

Поскольку вы пытаетесь сохранить итераторы в неупорядоченном наборе, вам не нужен оператор сравнения, а нужна хеш-функция.

Я предполагаю, поскольку каждый отдельный итератор будет указывать наВы можете использовать хеш-значение ключа для хеширования итератора.

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.

Осторожно с аннулированием итератора.

...