Вам нужна пользовательская функция сравнения для std::set
, так как вы используете std::pair
в качестве типа шаблона.В C ++ 11 вы также можете сделать это как лямбду.
Идея функции compare
заключается в том, чтобы сначала проверить, является ли Pair
значение Pair.first < Pair.second
, если нет, поменять их местами, чтобы сделать ихв порядке внутри compare
функции.Это не изменит порядок оригинальных вставленных парных элементов, но удалит дубликаты, как вы упомянули.
auto compare = [](pairs lhs, pairs rhs)
{
if(lhs.first > lhs.second ) lhs = pairs{lhs.second, lhs.first };
if(rhs.first > rhs.second ) rhs = pairs{rhs.second, rhs.first };
return lhs< rhs;
};
Примерно так: Смотрите в прямом эфире здесь
#include <iostream>
#include <set>
typedef std::pair<int, int> pairs;
int main()
{
auto compare = [](pairs lhs, pairs rhs) //custom compare lambda function
{
if(lhs.first > lhs.second ) lhs = pairs{lhs.second, lhs.first };
if(rhs.first > rhs.second ) rhs = pairs{rhs.second, rhs.first };
return lhs< rhs;
};
std::set<pairs, decltype(compare)> Set(compare);
Set.emplace(std::make_pair(0,1)); // use can also emplace to the Set
Set.emplace(pairs{0,2});
Set.emplace(pairs{1,0});
for(const auto& it: Set)
std::cout << it.first << " " << it.second << std::endl;
}
Вывод:
0 1
0 2