Линейные структуры данных и стандартная библиотека шаблонов



бет2/2
Дата05.09.2020
өлшемі0,69 Mb.
#77415
1   2

Строки

  • В языке C строки было принято представлять в виде массива символов:
  • В языке C++ для представления строки используется класс string
  • Обе структуры линейны, но вторую принято считать более удобной, безопасной и простой в использовании

Класс String

  • #include
  • Поддерживает операции:
  • Удаления посл-ти символов (erase)
  • Поиска подстроки (find)
  • Возврата подстроки (substr)
  • Замены подстроки (replace)
  • Вставки подстроки (insert)

Стандартная библиотека шаблонов STL

Контейнеры STL

  • Контейнеры в STL – обобщенный классы, моделирующие различные структуры данных
  • Например:
    • #include
    • #include
    • #include

Контейнеры STL

  • #include // строки
  • #include // динамический массив
  • #include // двусвязный список
  • #include // дек
  • #include // очередь
  • #include // стэк
  • #include // множество
  • #include // ассоциативный список

Итераторы

  • Итераторы – интерфейс между контейнерами и алгоритмами.
  • Итератор - это универсальный способ доступа к элементам контейнера.
  • Ведет себя как указатель.
  • Пример:
    • string A = "This is a string";
    • string::iterator it; // создание итератора
    • for (it = A.begin(); it != A.end(); ++it) {
    • cout << *it << endl;
  • }

Алгоритмы

  • Реализованы как свободные функции, а не члены-функции
  • Использование - #include
  • Все алгоритмы работают с итераторами на контейнерах
  • Для корректной работы – использование пространства имен std

Использование Vector

  • Vector – динамически расширяемый массив
  • Объявление – vector v();
  • Доступ к элементам – так же как в массиве, сложность O(1)
  • Добавление элемента – O(1) в конец, O(n) в других случаях
  • Поиск O(n)

Дек

  • С точки зрения программиста – использование схоже с Vector
  • Отличие в реализации – Vector – это массив, когда как для удобство добавления элемента Deque реализован как множество массивов

Использование Дека

  • // Предикат
  • bool is_odd(int i) {
    • return ((i % 2) == 1);
  • }
  • int main(int argc, char* argv[]) {
    • deque numbers;
    • for (int i = 0; i < 20; i++) {
      • numbers.push_back(i);
    • }
    • cout << count(numbers.begin(), numbers.end(), 10) << endl;
    • cout << count_if(numbers.begin(), numbers.end(), is_odd)
    • << endl;
    • return EXIT_SUCCESS;
  • }

Связные списки

  • Связный список - это разновидность линейных структур данных, представляющая собой последовательность элементов, обычно отсортированную в соответствии с заданным правилом. Последовательность может содержать любое количество элементов, поскольку при создании списка используется динамическое распределение памяти.
  • Каждый элемент связного списка представляет собой отдельный объект, содержащий поле для хранения информации и указатель на следующий элемент списка (а в случае двусвязного списка в объекте хранится также указатель на предыдущий элемент).

Использование list

  • Объявление - list l1;
  • Добавление элемента – O(n) в худшем случае
  • // Добавить элемент после 1ого
    • list l(10);
    • list::iterator it = l.begin();
    • it++;
  • l.insert(it, 5);
  • Удаление элемента – O(n) в худшем случае
  • // Удаление второго элемента
    • list l(10);
    • list::iterator second = l.begin();
    • second++;
    • l.erase(second);
  • Поиск – О(n)

Очередь

Очередь - Пример

  • queue q;
  • // добавить и удалить
  • q.push(1);
  • q.pop();
  • // доступ к первому и последнему
  • q.push(1);
  • q.push(2);
  • cout << q.front() << endl;
  • cout << q.back() << endl;
  • // размер
  • cout << q.size() << endl;
  • cout << q.empty() << endl;

Стек

  • Очередь – линейная структура данных, удовлетворяющая принципу FILO(первый пришел – последний ушел)
  • Поддерживает добавление элемента в конец, доступ к первому и последнему, удаление последнего элемента

Стек-Пример

  • stack s;
  • // Добавление и удаление элемента из вершины стека
  • s.push(1);
  • s.pop();
  • // Доступ к вершине стека
  • s.push(10);
  • s.push(11);
  • cout << s.top() << endl;
  • // Размер
  • cout << s.size() << endl;
  • cout << s.empty() << endl;


Достарыңызбен бөлісу:
1   2




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет