Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

22.4.1. Використання базових операцій для роботи зі списком

Функції-члени, визначені у класі list, подано у табл. 22.3. У кінець списку, як і у кінець вектора, елементи можна поміщати за допомогою функції push_back(), але за допомогою функції push_front() можна поміщати елементи у початок списку. Елемент можна також вставити і у середину списку, для цього використовується функція insert(). Один список можна помістити в інший, використовуючи функцію splice(). A за допомогою функції merge() два списки можна об'єднати і упорядкувати результат.

Табл. 22.3. Функції-члени класу list

Функція-член

Опис

template <class InIter>

void assign(InIter start,

InIter end);

Поміщає у список послідовність, що визначається параметрами start і end

void assign(size_type num,

const myType &val);

Поміщає у список num елементів із значенням val

reference back();

const_reference back() const;

Повертає посилання на останній елемент у списку

iterator begin();

const_iterator begin() const;

Повертає ітератор для першого елемента у списку

void clear();

Видаляє всі елементи із списку

bool empty() const;

Повертає дійсне значення, якщо використовуваний список порожній, і помилкове – інакше

iterator end(); const_iterator end() const;

Повертає ітератор, який відповідає кінцю списку

iterator erase(iterator i);

Видаляє елемент, яка адресується ітератором i;

повертає ітератор, який вказує на елемент, розташований після видаленого

iterator erase(iterator start, iterator end);

Видаляє елементи у діапазоні, що задається параметрами start і end; повертає ітератор для елемента, розташованого за останнім видаленим елементом

reference front();

const_reference front() const;

Повертає посилання на перший елемент у списку

allocator_type

get_allocator() const;

Повертає розподільник пам'яті списку

iterator insert(iterator i,

const myType &val = myType());

Вставляє значення val безпосередньо перед елементом, заданим параметром i; повертає ітератор для цього елемента

void insert(iterator i,

size_type num, const myType &val);

Вставляє num копій значення val безпосередньо перед елементом, заданим параметром i

template <class InIter>

void insert(iterator i,

InIter start, InIter end);

Вставляє у список послідовність, що визначається параметрами start і end, безпосередньо перед елементом, заданим параметром i

size_type max_size() const;

Повертає максимальну кількість елементів, яке можу містити список

void merge(list<myType,

Allocator> &ob>);

template <class Comp>

void merge(list<myType,

Allocator> &ob, Comp cmpfn);

Об'єднує впорядкований список, що міститься в об'єкті ob, із впорядкованим списком, який його викликає. Результат також упорядковується. Після об'єднання список, що міститься в ob, залишається порожнім. У другому форматі може бути задана функція порівняння, яка визначає, за яких умов один елемент є меншим від іншого

void pop_back();

Видаляє останній елемент у списку

void pop_front();

Видаляє перший елемент у списку

void push_back(const myType &val);

Додає у кінець списку елемент із значенням, що задається параметром val

void push_front(const myType &val);

Додає у початок списку елемент із значенням, що задається параметром val

reverse_iterator rbegin(); const_reverse_iterator rbegin() const;

Повертає реверсивний ітератор для кінця списку

reverse_iterator rend(); const_reverse_iterator rend() const;

Повертає реверсивний ітератор для початку списку

void remove(const myType &val);

Видаляє із списку елементи із значенням val

template <class UnPred>

void remove_if(UnPred pr);

Видаляє елементи, для яких унарний предикат pr дорівнює значенню true

void resize(size_type num,

myType val = myType());

Встановлює розмір списку, що дорівнює значенню, заданому параметром num. Якщо список для цього по­трібно подовжити, то у кінець списку додаються елементи із значенням, що задається параметром val

void reverse();

Реверсує список

size_type size() const;

Повертає поточну кількість елементів у списку

void sort();

template <class Сomp>

void sort(Сomp cmpfn);

Сортує список. Друга форма сортує список за допомогою функції порівняння cmpfn, яка дає змогу визначати, за яких умов один елемент є меншим від іншого

void splice(iterator i, list<myType, Allocator> &ob);

Вставляє вміст списку ob у список, який його викликає, у позицію, вказану ітератором iПісля виконання цієї операції список ob залишається порожнім

void splice(iterator i, list<myType, Allocator> &ob>, iterator el);

Видаляє із списку ob елемент, яка адресується ітератором el, і зберігає його у списку, який його викликає, у позицію, яка адресується ітератором i

void splice(iterator i, list<myType, Allocator> &ob, iterator start, iterator end);

Видаляє із списку ob діапазон, визначений параметрами start і end, і зберігає його у списку, який його викликає, починаючи з позиції, яка адресується ітератором i

void swap(list<myType,

Allocator> &ob);

Виконує обмін елементами списку, який його викликає, і списку ob

void unique();

template <class BinPred>

void unique(BinPred pr);

Видаляє із списку елементи-дублікати. Друга форма для визначення унікальності використовує предикат pr

Щоб досягти максимальної гнучкості і переносності для будь-якого об'єкта, який підлягає зберіганню у списку, необхідно визначити конструктор за замовчуванням і оператор "<" (і бажано інші оператори порівняння). Точніші вимоги до об'єкта (як до потенційного елемента списку) необхідно погоджувати відповідно до документації на використовуваний Вами компілятор.

Розглянемо простий приклад використання списку.

Код програми 22.6. Демонстрація механізму використання базових операцій для роботи зі списком

#include <iostream> // Для потокового введення-виведення

#include <list> // Для роботи зі списками

using namespace std; // Використання стандартного простору імен

int main()

{

list<char> lst; // Створення порожнього списку

int i;

// Поміщаємо значення у список

for (i=0; i<10; i++) lst.push_back('A1+i);

// Відображаємо початковий розміру списку

cout << "Розмір = " << lst.size() << endl;

// Відображаємо початковий вміст списку

cout << "Вміст: ";

list<char>::iterator p = lst.begin();

// Отримуємо доступ до вмісту списку за допомогою ітератора.

while(p != lst.end()) {

cout << *p << " ";

p++;

}

cout << endl;

getch(); return 0;

}

Результати виконання цієї програми є такі:

Розмір = 10

Вміст: A B C D E F G H I J

У процесі виконання ця програма створює список символів. Спочатку створюється порожній об'єкт списку. Потім у нього поміщається десять букв (від А до J). Заповнення списку реалізується шляхом використання функції push_back(), яка поміщає кожне нове значення у кінець наявного списку. Після цього відображається розмір списку і його вміст. Вміст списку виводиться на екран внаслідок виконання такого коду програми:

list<char>::iterator p = lst.begin();

while(p != lst.end()) {

cout << *p << " ";

p++;

}

Тут ітератор р ініціалізувався так, щоб він указував на початок списку. У процесі виконання чергового проходу циклу ітератор р інкрементується, щоб вказувати на наступний елемент списку. Цей цикл завершується, коли ітератор р вказує на кінець списку. Застосування таких циклів – звичайна практика під час використання бібліотеки STL. Наприклад, аналогічний цикл ми застосували для відображення вмісту вектора у попередньому розділі.

Оскільки списки є двоспрямованими, то заповнення їх елементами можна проводити з обох кінців. Наприклад, у процесі виконання наведеної нижче програми створюється два списки, причому елементи одного з них розташовані у порядку, зворотному стосовно іншого.

Код програми 22.7. Демонстрація механізму внесення елементів у список як з початку, так і з кінця

#include <iostream> // Для потокового введення-виведення

#include <list> // Для роботи зі списками

using namespace std; // Використання стандартного простору імен

int main()

{

list<char> lst; // Створення порожнього списку

list<char> revlst; // Створення порожнього списку

int i;

// Поміщаємо значення у список

for(i=0; i<10; i++) lst.push_back('A'+i);

// Відображаємо початковий вміст списку

cout << "Розмір списку lst = " << lst.size() << endl;

cout << "Початковий вміст списку: ";

list<char>::iterator p;

/* Видаляємо елементи із списку lst і поміщаємо їх

у список revlst у зворотному порядку. */

while(!list.empty()) {

p = lst.begin();

cout << *p " ";

revlst.push_front(*p);

lst.pop_front();

}

cout << endl << endl;

// Відображаємо реверсний вміст списку

cout << "Розмір списку revlst = ";

cout << revlst.size() << endl;

cout << "Реверсний вміст списку: ";

p = revlst.begin();

while(p != revlst.end()) {

cout << *p " ";

p++;

}

cout << endl;

getch(); return 0;

}

Внаслідок виконання цієї програми на моніторі буде відображено такі результати:

Розмір списку lst = 10

Початковий вміст списку: A B C D E F G H I J

Розмір списку revlst = 10

Реверсний вміст списку: J I H G F E D C B A

У цій програмі список реверсує шляхом видалення елементів з початку списку lst і занесення їх у початок списку revlst.