2015-02-16 2 views
0

мне нужен контейнер, чтобы содержать только уникальные элементы, поэтому у меня есть структура вроде этого:Как чтобы убедиться в отсутствии дубликатов в повышение :: unordered_set пользовательских данных

class OD 
{ 
private: 
    std::string key; 
public: 
    OD(){} 
    OD(const WayPoint &origin, const WayPoint &destination): 
     origin(origin), destination(destination) 
    { 
     std::stringstream str(""); 
     str << origin.node_->getID() << "," << destination.node_->getID(); 
     key = str.str(); 
    } 
    bool operator<(const OD & rhs) const 
    { 
     return key < rhs.key; 
    } 
    bool operator()(const OD & rhs, const OD & lhs) 
    { 
     return rhs < lhs; 
    } 
}; 

и контейнер:

std::set<OD,OD> t; 

Теперь мне нужно сменить мой контейнер на boost::unordered_set, Мне нужно изменить функтор? Я смущен, потому что знаю, что я не могу разделить реализацию порядка и уникальности, и на этот раз контейнер не упорядочен. Поэтому я боюсь, что перегрузка будет бесполезной.

+3

Компаратор по умолчанию для 'set' (' std :: less ') уже отменил оператор' <'; не нужно создавать пользовательские. Для 'unordered_set' вам нужен хэш и оператор' == '. –

+0

Ответ [здесь] (http://stackoverflow.com/questions/6687162/c-some-questions-on-boostunordered-map-boosthash?rq=1) сообщает, что нужно. –

ответ

0

Вот пример определения пользовательского хэша и операторов сравнения для unordered_set:

#include <iostream> 
#include <functional> 
#include <unordered_set> 

struct X 
{ 
    std::string key_; 
}; 

int main() { 
    std::unordered_set<X, 
         std::function<size_t(const X&)>, 
         std::function<bool(const X&, const X&)> > s{ 
      5, // initial bucket count 
      [](const X& x) { return std::hash<decltype(x.key_)>()(x.key_); }, 
      [](const X& lhs, const X& rhs) { return lhs.key_ == rhs.key_; } 
     }; 
    s.insert({"one"}); 
    s.insert({"two"}); 
    s.insert({"three"}); 
    for (auto& x : s) 
     std::cout << x.key_ << '\n'; 
} 

Посмотреть запустить here.

Смежные вопросы