Я пытаюсь изменить порядок элементов по умолчанию в наборе целых чисел, чтобы он был лексикографическим, а не числовым, и я не могу получить следующее для компиляции с g ++:
file.cpp:
bool lex_compare(const int64_t &a, const int64_t &b)
{
stringstream s1,s2;
s1 << a;
s2 << b;
return s1.str() < s2.str();
}
void foo()
{
set<int64_t, lex_compare> s;
s.insert(1);
...
}
Я получаю следующую ошибку:
error: type/value mismatch at argument 2 in template parameter list for ‘template<class _Key, class _Compare, class _Alloc> class std::set’
error: expected a type, got ‘lex_compare’
Что я делаю не так?
std::set<int64_t, decltype(&lex_compare)> s(&lex_compare)
1. Современное решение C ++ 20
Мы используем лямбда-функцию в качестве компаратора. Как обычно, компаратор должен возвращать логическое значение, указывающее, считается ли элемент, переданный в качестве первого аргумента, предшествующим второму в конкретном строгом слабом порядке, который он определяет.
Онлайн-демонстрация
2. Современное решение C ++ 11
До C ++ 20 нам нужно передать лямбда в качестве аргумента для конструктора установки
Онлайн-демонстрация
3. Аналогично первому решению, но с функцией вместо лямбды.
Сделайте компаратор как обычную логическую функцию
Затем используйте его так:
Онлайн-демонстрация
или так:
Онлайн-демонстрация
4. Старое решение с использованием структуры с
()
операторомОнлайн-демонстрация
5. Альтернативное решение: создать структуру из логической функции
Возьмите логическую функцию
И сделайте из него структуру, используя
std::integral_constant
Наконец, используйте структуру как компаратор
Онлайн-демонстрация
источник
Ответ Якоби вдохновляет меня написать адаптер для инкапсуляции шаблона функтора.
Вау, я думаю, это того стоило!
источник
Вы можете использовать компаратор функций, не оборачивая его так:
что раздражает печатать каждый раз, когда вам нужен набор этого типа, и может вызвать проблемы, если вы не создадите все наборы с одним и тем же компаратором.
источник
std::less<>
при использовании пользовательских классов сoperator<
Если вы имеете дело с набором определенного вами пользовательского класса
operator<
, вы можете просто использоватьstd::less<>
.Как упоминалось на http://en.cppreference.com/w/cpp/container/set/find, C ++ 14 добавил два новых
find
API:которые позволяют вам делать:
main.cpp
Скомпилируйте и запустите:
Более подробную информацию
std::less<>
можно найти по адресу: Что такое прозрачные компараторы?Проверено на Ubuntu 16.10,
g++
6.2.0.источник