2016-01-19 2 views
1

Предположим, у меня есть QList из 100 MyItem объектов, вставленных в определенном порядке. У каждого MyItem есть связанный timestamp и некоторая собственность p, которая не гарантируется быть уникальной.Сохраняет ли qStableSort порядок эквивалентных элементов?

struct MyItem { 
    enum MyProperty { ONE, TWO, THREE }; 

    double timestamp; //unique 
    MyProperty p;  //non-unique 

    bool operator<(const MyItem& other) const { 
     return p < other.p; 
    } 
}; 

Предположив Я добавил мои 100 объектов в хронологическом порядке, если бы я был бежать qStableSort на этом контейнере (таким образом, сортировка по p), у меня есть гарантия, что при заданном значении p, что они все еще находятся в хронологический порядок?

+3

Я на самом деле не знаю, вообще ничего о 'qStableSort', но я думал, что это то, что' stable' часть любого 'стабильного рода 'означает - порядок эквивалентных элементов сохраняется. [Wikipedia Stable Sorts] (https://en.wikipedia.org/wiki/Category:Stable_sorts) – dwanderson

+1

Я думаю, вы имеете в виду «не гарантировано быть уникальным» :). Во всяком случае, это определение того, что означает «стабильный» в «стабильном роде». – rici

+0

@dwanderson Я полагаю, это точно мой вопрос. Описание функции просто говорит, что оно «стабильно», не определяя этот термин. – Phlucious

ответ

0

https://en.wikipedia.org/wiki/Category:Stable_sorts

устойчивых алгоритмов сортировки поддерживать относительный порядок записей с одинаковыми ключами (т.е. значений). То есть алгоритм сортировки является стабильным, если всякий раз, когда есть две записи R и S с одним и тем же ключом и с R, появляющимся перед S в исходном списке, R появится перед S в отсортированном списке.

Поэтому ключевое слово в qStableSortстабильной точно ссылаясь на то, что вы просите.

Однако обратите внимание, что qStableSort вместо этого obsoleted in Qt 5.5

Использование станд :: stable_sort.

Сортирует элементы в диапазоне [начало, конец] в порядке возрастания, используя стабильный алгоритм сортировки.

Если ни один из двух элементов не «меньше» другого, элементы считаются равными. Элемент, который появился перед другим в исходном контейнере, по-прежнему будет отображаться первым после сортировки. Это свойство часто полезно при сортировке видимых пользователем данных.

Согласно документации Qt, вы должны предпочесть использовать std::stable_sort

+0

Я не могу найти никакой документации, объясняющей, почему std :: stable_sort будет предпочтительнее. Есть ли какой-либо? – Phlucious

+1

@Phlucious: объясняется в письме, которое я написал, объявив об изменении http://lists.qt-project.org/pipermail/ разработка/2013-сентябрь/01312 2.html, а также в 5.2.0 changelog: http://code.qt.io/cgit/qt/qtbase.git/tree/dist/changes-5.2.0 – peppe

+0

@peppe Отличная ссылка! Документы говорят, что он был устаревшим в 5.5, поэтому я не выглядел так же, как 5.2.0. – Phlucious

Смежные вопросы