Сортировка векторов C++

C++ Программирование и разработка

Вектор C ++ подобен массиву с функциями-членами (методами). Длина вектора может быть увеличена или уменьшена в процессе выполнения программы. Вектор имеет множество функций-членов. Среди всех этих функций-членов не сортирует вектор. Однако в C ++ есть библиотека, называемая библиотекой алгоритмов. В этой библиотеке есть много универсальных алгоритмических функций. Одна из них — функция sort (). Эта функция может использоваться для сортировки контейнеров C ++, таких как вектор. Все значения вектора являются значениями одного типа.

Программист может написать свою собственную функцию sort (). Однако функция sort () из библиотеки алгоритмов, вероятно, будет работать лучше, чем то, что пишет обычный программист.

Функция sort () может сортировать значения вектора в порядке возрастания или убывания. Для сортировки вектора должна быть включена библиотека алгоритмов. Также должна быть включена векторная библиотека. Начало программы должно быть примерно таким:

#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

Вектор на самом деле является классом, из которого могут быть созданы векторные объекты. С помощью приведенного выше верхнего раздела программы вектор для сортировки может быть создан следующим образом:

vector <char> vtr = {‘Z’, ‘X’, ‘C’, ‘V’, ‘B’, ‘N’, ‘M’, ‘A’, ‘S’, ‘D’};

Имя класса — вектор. Имя созданного объекта — vtr.

В этом руководстве кодирование сортировки выполняется с помощью функции C ++ main (). В этом руководстве объясняется, как отсортировать вектор C ++ с использованием указанного выше вектора vtr.

Сортировка по умолчанию

Сортировка по умолчанию выполняется в порядке возрастания. Синтаксис для этого:

template<class RandomAccessIterator>

void sort(RandomAccessIterator first, RandomAccessIterator last);

Сортировка всего вектора

Следующий код сортирует весь вектор:

sort(vtr.begin(), vtr.end());

for (int i=; i<vtr.size(); i++)

cout<<vtr[i]<<«, «;

cout<<endl;

Несортированный список:

Z, X, C, V, B, N, M, A, S, D

Отсортированный список:

A, B, C, D, M, N, S, V, X, Z,

Если сортировка некорректна, значит, виноват программист, а не функция sort ().

RandomAccessIterator является внутренним. vtr.begin () возвращает итератор, указывающий на первый элемент, а vtr.end () возвращает другой итератор того же типа, который указывает сразу после последнего элемента. Таким образом, нет необходимости создавать экземпляр вектора, указывающего RandomAccessIterator. Таким образом сортируется весь список.

Сортировка диапазона по возрастанию

Несортированный список выше состоит из десяти элементов с индексами:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9

Чтобы отсортировать только элементы из позиции 4, которая является индексом, 3 = 4-1, до позиции 9, которая является индексом, 8 = 9-1, добавьте 3 к vtr.begin (), чтобы получить первый итератор, а затем добавьте 8 в vtr.begin (), чтобы иметь последний итератор для функции sort (). 9- й элемент индекса 8 не будет включен в сортировку. То есть последний элемент, указанный в выбранном диапазоне, исключается из сортировки. Следующий код иллюстрирует это:

sort(vtr.begin() + 3, vtr.begin() + 8);

for (int i=; i<vtr.size(); i++)

cout<<vtr[i]<<«, «;

cout<<endl;

Несортированный список:

Z, X, C, V, B, N, M, A, S, D
[/c]c
The sorted list is:
[cc lang=»text» width=»100%» height=»100%» escaped=»true» theme=»blackboard» nowrap=»0″]
Z, X, C, A, B, M, N, V, S, D,

Элементы в позициях 4, 5, 6, 7, 8 отсортированы. Элемент на 9 — е позиции не был включен в этом роде. Эти позиции соответствуют индексам 3, 4, 5, 6, 7. Элемент с индексом 8 не был включен в сортировку.

Читайте также:  MEAN или LAMP и не только: какой технический стек использовать

Итак, чтобы отсортировать диапазон, определите первый и последний элементы в диапазоне, не обязательно всего списка. Добавьте индекс первого элемента в итератор begin (). Добавьте индекс последнего элемента в итератор begin (). Помните, что последний элемент диапазона не будет включен в сортировку, но будет включен первый элемент диапазона.

Добавление индекса к итератору возможно, потому что добавление числа равносильно увеличению итератора на такое же количество раз. При однократном увеличении итератора он указывает на следующий элемент.

Сортировка по убыванию

Синтаксис:

template<class RandomAccessIterator, class Compare>

void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
[/c]
This differs from the above syntax with the presence of “Compare comp”. comp is a function pointer or a function object. comp actually decides whether the sorting should be ascending or descending. Its absence is the default case, which means descending.
<h3>Sorting the Whole List in Descending Order</h3>
The following code sorts the whole above vector in descending order:
[cc lang=«c» width=«100%» height=«100%» escaped=«true» theme=«blackboard» nowrap=«0»]
sort(vtr.begin(), vtr.end(), greater<char>());

for (int i=; i<vtr.size(); i++)

cout<<vtr[i]<<«, «;

cout<<endl;

Несортированный список:

Z, X, C, V, B, N, M, A, S, D

Вектор, отсортированный в порядке убывания:

Z, X, V, S, N, M, D, C, B, A,

Обратите внимание на использование «больше ()» вместо comp.

Противоположно больше () меньше (), которое является значением по умолчанию (по возрастанию), и его не нужно вводить.

Сортировка диапазона в порядке убывания

Диапазон можно отсортировать как по убыванию, так и по возрастанию. Следующий код сортирует с 4- го по 9- й элемент без включения 9- го элемента; и по убыванию.

sort(vtr.begin() + 3, vtr.begin() + 8, greater<char>());

for (int i=; i<vtr.size(); i++)

cout<<vtr[i]<<«, «;

cout<<endl;

Несортированный список:

Z, X, C, V, B, N, M, A, S, D

Вектор с выбранным диапазоном, отсортированный в порядке убывания:

Z, X, C, V, N, M, B, A, S, D,

Пользовательская функция сравнения

Следующая программа имеет настраиваемую функцию сравнения для сортировки по возрастанию:

    #include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

vectorvtr = {‘Z’, ‘X’, ‘C’, ‘V’, ‘B’, ‘N’, ‘M’, ‘A’, ‘S’, ‘D’};

bool compare (char a, char b) {
return (< b);
}

int main()
{
sort(vtr.begin(), vtr.end(), compare);

for (int i=; i<vtr.size(); i++)
cout<<vtr[i]<<«, «;
cout<<endl;

return ;
}

Функция сравнения называется compare. Возвращает логическое значение. Он имеет два параметра, a и b, того же типа, что и тип векторного элемента. Он возвращает true, если a меньше b, и false в противном случае. Имя этой функции — третий аргумент вызова функции sort (). В этой программе сравнение аналогично less (). Вместо сравнения можно использовать другие имена.

Несортированный список:

Z, X, C, V, B, N, M, A, S, D

Отсортированный список:

A, B, C, D, M, N, S, V, X, Z,

Конечно, для диапазона можно использовать настраиваемую функцию сравнения. Следующая программа иллюстрирует это:

#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

vectorvtr = {‘Z’, ‘X’, ‘C’, ‘V’, ‘B’, ‘N’, ‘M’, ‘A’, ‘S’, ‘D’};

bool compare (char a, char b) {
return (< b);
}

int main()
{
sort(vtr.begin() + 3, vtr.begin() + 8, compare);

for (int i=; i<vtr.size(); i++)
cout<<vtr[i]<<«, «;
cout<<endl;

return ;
}

Несортированный список:

Z, X, C, V, B, N, M, A, S, D

Отсортированный список:

Z, X, C, A, B, M, N, V, S, D,

Функция сравнения может быть закодирована по убыванию. Следующая программа иллюстрирует это:

#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

vectorvtr = {‘Z’, ‘X’, ‘C’, ‘V’, ‘B’, ‘N’, ‘M’, ‘A’, ‘S’, ‘D’};

bool compare (char a, char b) {
return (> b);
}

int main()
{
sort(vtr.begin(), vtr.end(), compare);

for (int i=; i<vtr.size(); i++)
cout<<vtr[i]<<«, «;
cout<<endl;

return ;
}

Просто замените (a <b) на (a> b).

Читайте также:  Введение в языки объектно-ориентированного программирования: руководство

Несортированный список:

Z, X, C, V, B, N, M, A, S, D

Отсортированный список:

Z, X, V, S, N, M, D, C, B, A,

Пользовательская функция сравнения может использоваться для диапазона в порядке убывания. Следующая программа иллюстрирует это:

#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

vectorvtr = {‘Z’, ‘X’, ‘C’, ‘V’, ‘B’, ‘N’, ‘M’, ‘A’, ‘S’, ‘D’};

bool compare (char a, char b) {
return (> b);
}

int main()
{
sort(vtr.begin()+3, vtr.begin()+8, compare);

for (int i=; i<vtr.size(); i++)
cout<<vtr[i]<<«, «;
cout<<endl;

return ;
}

Несортированный список:

Z, X, C, V, B, N, M, A, S, D

Вектор с выбранным диапазоном, отсортированный в порядке убывания:

Z, X, C, V, N, M, B, A, S, D,

Другие типы данных

Другие типы данных можно сортировать по их типам. Например, если тип данных int должен быть отсортирован, то «int» будет использоваться для создания вектора и во встроенной или настраиваемой функции сравнения. Если тип данных находится в библиотеке, то заголовок библиотеки должен быть включен в программу, как в случае со строкой ниже:

#include <iostream>

#include <algorithm>

#include <vector>

#include <string>

using namespace std;

vectorvtr = {«Ze», «Xe», «Ce», «Ve», «Be», «Ne», «Me», «Ae», «Se», «De»};

int main()
{
sort(vtr.begin(), vtr.end(), greater());

for (int i=; i<vtr.size(); i++)
cout<<vtr[i]<<«, «;
cout<<endl;

return ;
}

Несортированный список:

Ze, Xe, Ce, Ve, Be, Ne, Me, Ae, Se, De

Отсортированный список:

Ze, Xe, Ve, Se, Ne, Me, De, Ce, Be, Ae,

Заключение

C ++ поставляется с библиотекой алгоритмов, в которой есть функция sort (). Эта функция при обычном использовании принимает два или три аргумента. Первый аргумент — это список векторов, с которого должна начинаться сортировка. Второй аргумент — на чем должен заканчиваться вектор-список, сортировка. Третий аргумент определяет, будет ли сортировка выполняться по возрастанию или по убыванию.

Оцените статью
bestprogrammer.ru
Добавить комментарий