2015-01-10 2 views
4

Я читал блог Страуструп на C++ (http://isocpp.org/blog/2014/12/myths-3), когда я нашел межжала кусок кода:Container версия C++ рода

void do_my_sort(vector<double>& v) 
{ 
    sort(v,[](double x, double y) { return x>y; }); // sort v in decreasing order 
} 

int main() 
{ 
    vector<double> vd; 
    // ... fill vd ... 
    do_my_sort(v); 
    // ... 
} 

Обратите внимание, что sort не использует традиционную sort(v.begin(), v.end(), ...) который объясняет Страуструп:

Я использовал версию контейнера sort(), чтобы избежать явного описания итераторов .

Однако, я пробовал тот же код на моем компиляторе C++ 11, но он не компилируется. Я также пробовал то же самое на компиляторе C++ 14, используя ideone, но он тоже не компилируется, говоря, что не существует соответствующего вызова для сортировки.

Почему это?

Кроме того, Страуструп рядом упоминает:

я мог бы пойти дальше и использовать C++ 14 сравнения объекта с:

sort(v,greater<>()); // sort v in decreasing order

я использовал компараторов как great<>() для sort в C++ 11. Почему он заявляет, что это объект сравнения C++ 14?

+0

Для использования зЬй :: рода, возможно, придется #include erenon

+0

@erenon Я знаю, что и уже сделали это. Он по-прежнему говорит, что не существует соответствующего вызова для сортировки. – 1110101001

+0

В стандарте нет стандартной версии контейнера, но, надеюсь, скоро: https://ericniebler.github.io/std/wg21/D4128.html – BenPope

ответ

10

Он сам это написал, это не стандарт. Таким образом, вы не можете найти его в стандартной библиотеке. Вы могли бы реализовать это следующим образом:

template <class Container, class Comp> 
void sort (Container& cont, Comp comp) { 
    using std::begin; 
    using std::end; 
    std::sort(begin(cont), end(cont), comp); 
} 

Как Clukester указывал, есть также boost::sort, который предлагает эту функциональность.

+1

О, хорошо. Я думал, что это часть языкового стандарта или недавно появившаяся функция. Было бы неплохо, если бы он упомянул, что это специальная функция. – 1110101001

+0

Почему бы не добавить аргумент по умолчанию к шаблону Comp? 'class Comp = less <>'? – Mark

+1

@Mark Нет причин не делать этого, я просто чувствую, что это не относится к вопросу выше. Мне нравится держать его максимально коротким и простым. –

1

Возможно, он использует сортировку Boost, а не стандартную сортировку, как и следовало ожидать. Так что это boost::sort, а не std::sort.

+0

Нет, это просто пример, иллюстрирующий другую точку. – juanchopanza

4

Я использовал компараторы, такие как great<>() для сортировки в C++ 11 тоже. Почему он заявляет, что это объект сравнения C++ 14?

Функционалы сравнения C++ 14 имеют дополнительную возможность пересылать ссылки для своего метода operator() и выводить возвращаемые типы. Аргумент шаблона для коллекции Function Objects был изменен для использования аргумента по умолчанию типа void и использования специализации для этого типа.

template< class T = void > 
struct greater 
{ 
    constexpr bool operator()(const T &lhs, const T &rhs) const; 
}; 

template<> 
struct greater<void> 
{ 
    template< class T, class U> 
    constexpr auto operator()(T&& lhs, U&& rhs) const 
     -> decltype(std::forward<T>(lhs) > std::forward<U>(rhs)); 
};