Класс forward_list: объединение упорядоченных списков

Метод merge() предназначен для объединения упорядоченных списков. Результатом выполнения метода является упорядоченный текущий список. Для объединения не отсортированных списков можно использовать метод splice_after() (см. разд. 17.2.9). Прототипы метода merge():

void merge(forward_list &x);
void merge(forward_list &&x);
template<typename Compare> void merge(forward_list &x, Compare comp);
template<typename Compare> void merge(forward_list &&x, Compare comp);

Первые два прототипа переносят все элементы списка x в текущий список (в пользовательских классах должен быть перегружен оператор <, иначе получите ошибку при компиляции):

std::forward_list<int> arr1 = {3, 5, 1}, arr2 = {4, 2};
arr1.sort(); // 1 3 5
arr2.sort(); // 2 4
arr1.merge(arr2);
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl;                // 1 2 3 4 5
std::cout << std::distance(arr2.begin(), arr2.end())
          << std::endl;                // 0

Третий и четвертый прототипы позволяют дополнительно указать пользовательский способ сравнения элементов. Функтор comp принимает два параметра и должен возвращать значение true, если первое значение меньше второго, и false — в противном случае. Произведем объединение списков, отсортированных в обратном порядке:

std::forward_list<int> arr1 = {3, 5, 1}, arr2 = {4, 2};
arr1.sort( [](int &a, int &b) {return a > b;} ); // 5 3 1
arr2.sort( [](int &a, int &b) {return a > b;} ); // 4 2
arr1.merge(arr2, [](int &a, int &b) {return a > b;});
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl;                // 5 4 3 2 1
std::cout << std::distance(arr2.begin(), arr2.end())
          << std::endl;                // 0

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов