Форум программистов, компьютерный форум CyberForum.ru

sort и stable_sort - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Как вызвать метод родительского класса; http://www.cyberforum.ru/cpp-beginners/thread930086.html
Собственно вопрос; Есть класс a и b; Класс b унаследован от класса a; И как теперь из класса b вызвать функцию класса a;
C++ Ошибка error LNK1123: сбой при преобразовании в COFF: файл недопустим или поврежден Объясните, пожалуйста, как исправить эту проблему? У меня Visual Studio 2010 Ultimate http://www.cyberforum.ru/cpp-beginners/thread930074.html
Передача аргументов функции C++
В книге Стенли Липпмана C++ Primer дошел до программы, которая выполняет замену слов в одном файле, которые указаны в другом. Например, thx thanks 4 for u you w8 wait pls please - 1 файл, второй файл содержит текст, программа должна заменить все слова, указанные в списке в 1 файле. В студии в параметрах указываю адреса двух файлов. Программа завершается с кодом 0, ошибок нет, но файл...
C++ Векторы
Добрый день форумчане! обнаружил что вектор можно объявить следующим образом : vector<MyClass *,MyClass2 *> vector_name; или для простоты
C++ Найти ошибку в решении "Числа - палиндрома" (задача с acmp) http://www.cyberforum.ru/cpp-beginners/thread930058.html
Число - палиндром (Время: 1 сек. Память: 16 Мб Сложность: 29%) Напомним, что палиндромом называется строка, одинаково читающаяся с обеих сторон. Например, строка «ABBA» является палиндромом, а строка «ABC» - нет. Необходимо определить, в каких системах счисления с основанием от 2 до 36 представление заданного числа N является палиндромом. В системах счисления с основанием большим...
C++ сигналы SIGINT SIGABORT нужно организовать программу перехвата сигналов: 1. SIGINT - при нажатии ctrl+c 2. SIGABRT - при вызове функции abort() первое попробовал организовать при бесконечном цикле - не получилось второе вроде бы перехватывает но при этом выдает ошибку debug error! как поступить? #include <iostream> using namespace std; подробнее

Показать сообщение отдельно
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.08.2013, 11:43     sort и stable_sort
На случай, если возникнет вопрос "а зачем это нужно, ведь элементы и так одинаковые?" С числами, символами, и другими данными, которые мы привыкли сравнивать, это действительно не нужно. Но возьмём ситуацию, когда сортируется массив элементов такого типа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Foo
{
public:
    Foo(int a, int b):
    m_a(a), m_b(b)
    { }
    
    int get_a() const
    {
        return a;
    }
    
    int get_b() const
    {
        return b;
    }
private:
    int m_a;
    int m_b;
};
При этом оператор сравнения написан так:
C++
1
2
3
4
bool operator<(const Foo&x, const Foo& y)
{
    return x.get_a() < y.get_a();
}
Т.е. сравнение происходит только по одному из полей. Тогда при обычной сортировке в общем случае мы не можем предсказать, в каком порядке будут идти объекты в контейнере, можно только сказать, что они наверняка будут идти в порядке невозрастания (неубывания) поля m_a. Стабильная же сортировка гарантирует и то, что объекты будут упорядочены по полю m_a, и то, что их порядок по полю m_b не изменится относительно друг друга.
Поясню на примере. пусть есть такой контейнер:
[{4, 2}, {7, 1}, {4, 8}, {3, 3}, {7, 5}, {4, 4}, {3, 0}, {7, 2}]
Сравнение происходит по первому полю. В результате обычной сортировки мы можем получить как результат
[{3, 3}, {3, 0}, {4, 2}, {4, 8}, {4, 4}, {7, 1}, {7, 5}, {7, 2}]
так и результат
[{3, 0}, {3, 3}, {4, 2}, {4, 4}, {4, 8}, {7, 2}, {7, 5}, {7, 1}]
или даже
[{3, 0}, {3, 3}, {4, 4}, {4, 8}, {4, 2}, {7, 2}, {7, 5}, {7, 1}]
Т.е. контейнер действительно упорядочен, но только по первому полю. По второму полю он может быть перемешан как угодно, в зависимости от алгоритма сортировки.
Стабильная же сортировка всегда выдаст один и тот же результат:
[{3, 3}, {3, 0}, {4, 2}, {4, 8}, {4, 4}, {7, 1}, {7, 5}, {7, 2}]
Контейнер снова упорядочен по первому полю, но по второму полю элементы друг относительно друга расположены в том же порядке, в котором они находились друг относительно друга до сортировки.
 
Текущее время: 12:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru