Как обеспечить отсутствие дубликатов в boost :: 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 тип, мне нужно изменить функтор? Я запутался, потому что знаю, что не могу разделить реализацию заказа и уникальности, и на этот раз контейнер не заказан. Так что я боюсь operator() перегрузка была бы бесполезна.

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';
}

Посмотри беги Вот.

0

Другие решения


По вопросам рекламы [email protected]