Проблема вызвана тем, что list::iterator
не имеет определенного сравнения. Тип значения std::set
требует строгого слабого упорядочения.
A vector
поддерживает итераторы с произвольным доступом, которые имеют порядок. Список требуется только для поддержки двунаправленных итераторов, которые не имеют порядка (конечно, реализация может поддерживать итераторы с произвольным доступом и для списков, поэтому на некоторых компиляторах это может работать).
Чтобы исправить это, вам нужно написать функцию сравнения самостоятельно. Проблема в том, что единственный способ определить порядок двух итераторов в list
- это пройтись от одного к другому, что требует линейного времени.