Двусвязные списки в C++

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

#include <list>

Давайте рассмотрим пример программы с использованием списка:

#include <iostream>
#include <list>     // подключаем заголовок списка
#include <iterator> // заголовок итераторов
using namespace std;

int main()
{
   list<int> myList; // объявляем пустой список
   for(int i = 0; i < 11; i++) {
       myList.push_back(i); // добавляем в список новые элементы
   }

   cout << "Список: ";
   copy(myList.begin(), myList.end(), ostream_iterator<int>(cout," ")); // вывод на экран элементов списка
   cout << "\nПервый элемент списка: " << myList.front();
   cout << "\nПоследний элемент списка: " << myList.back();
   return 0;
}

Результат работы программы:

CppStudio.com
Список: 0 1 2 3 4 5 6 7 8 9 10 
Первый элемент списка: 0 
Последний элемент списка: 10

Во второй строке мы подключили заголовок для использования контейнера списков. В строке 8 объявлен пустой список, то есть он не содержал никаких элементов. Дальше, в цикле for, в строках 9-11 мы заполняем стек новыми элементами. Добавить элементы в стек можно с помощью метода push_back(). В строке 14 выполняется вывод элементов списка на экран, с помощью функции copy(). Вывести элементы списка через цикл с использованием операции индексирования не получится, так как списки не поддерживают эту операцию:

myList[i]; // приведет к ошибке

Нельзя получить произвольный доступ к элементам списка. Для прямого обращения к элементам списка предусмотрены два метода: front() и back(), как показано в строках 15-16.  Давайте рассмотрим еще один пример программы, где показаны еще несколько замечательных функций списков:

#include <iostream>
#include <list>     // подключаем заголовок списка
#include <iterator> // заголовок итераторов
#include <ctime>
#include <cstdlib>
using namespace std;

int main()
{
   list<int> myList; // объявляем пустой список
   srand(time(NULL));

   for(int i = 0; i < 15; i++) {
       myList.push_back(rand()%20); // добавляем в список новые элементы
   }

   cout << "Список: ";
   copy(myList.begin(), myList.end(), ostream_iterator<int>(cout," "));

   myList.sort();   // отсортировали список по возрастанию
   cout << "\nОтсортированный список: ";
   copy(myList.begin(), myList.end(), ostream_iterator<int>(cout," "));

   myList.unique();   // удалили дубликаты элементов списка
   cout << "\nСписок с уникальными элементами: ";
   copy(myList.begin(), myList.end(), ostream_iterator<int>(cout," "));

   list<int> myList2; // объявляем еще один пустой список
   for(int i = 0; i < 15; i++) {
       myList2.push_back(rand()%20); // добавляем в список новые элементы
   }

   cout << "\nСписок2: ";
   copy(myList2.begin(), myList2.end(), ostream_iterator<int>(cout," "));

   myList2.merge(myList);
   cout << "\nОбъединили списки: ";
   copy(myList2.begin(), myList2.end(), ostream_iterator<int>(cout," "));
   return 0;
}

В строке 14 мы заполняем список случайными элементами, как всегда для заполнения списка используется метод push_back(), каждый новый элемент всегда добавляется в конец списка. Если вы хотите добавлять каждый новый элемент в начало списка, то используйте метод push_front(). В строке 20, мы воспользовались функцией сортировки списков — sort(), результат отсортированного списка выводится в строке 22. В строке 24, с помощью функции unique() в списке myList были удалены дубликаты элементов списка, это видно в результате работы программы. В строках 28 — 31 мы создали еще один список и заполнили его другими случайными элементами. И теперь, в строке 36, мы вызвали метод merge(), который объединил два списка. Результат программы можно посмотреть ниже:

CppStudio.com
Список: 6 15 6 10 6 15 18 17 15 18 18 11 12 17 17 
Отсортированный список: 6 6 6 10 11 12 15 15 15 17 17 17 18 18 18 
Список с уникальными элементами: 6 10 11 12 15 17 18 
Список2: 1 6 14 18 5 3 0 13 3 6 8 1 15 13 19 
Объединили списки: 1 6 6 10 11 12 14 15 17 18 5 3 0 13 3 6 8 1 15 13 18 19
Автор: Marienko L.
Дата: 16.01.2014
Поделиться:

Комментарии

  1. TonyVCLCSA .

    Интересно, что сортировка первого списка продолжает работать при том, что мы лишь присоединяем его ко второму и выводим второй. Я к тому, что присоединяет не только элементы, но еще и методы присоединяемого списка, при этом не влияя на основной. Вот так в огромном коде проморгаешь и будешь сто лет гадать, почему числа из одного списка прыгают, а другого — нет :)

  2. npavelFax

    Работа в интернете официальное трудоустройство.

  3. Влад Михальчук

    А как мне удалить элементы которые являются полусуммой соседних элементов

  4. Alex_Gates

    Alex_Gates

    и я не понял еще смысл листа, тоесть это тот же вектор просто нельзя обращатся к конкретному элементу чтоли ? а смысл этого ? обьясните пожалуйста. Спасибо заранее :)

  5. Alex_Gates

    Alex_Gates

    6 10 11 12 15 17 18   +
    1 6 14 18 5 3 0 13 3 6 8 1 15 13 19  =
    
    
    1 6 6 10 11 12 14 15 17 18 5 3 0 13 3 6 8 1 15 13 18 19         как это вообще работает ???
  6. Сергей Клементьев

    Во 2 строке «подклбчаем» исправить нужно на «подключаем» в обоих примерах.

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.