VIP Векторы и списки в C++

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

Руководство по использованию контейнеров vector и list из стандартной библиотеки C++.

Работа с vector

Код:
#include <vector>
#include <iostream>

int main() {
    // Создание вектора
    std::vector<int> numbers;
    
    // Добавление элементов
    numbers.push_back(10);
    numbers.push_back(20);
    numbers.push_back(30);
    
    // Доступ к элементам
    std::cout << "Первый элемент: " << numbers[0] << std::endl;
    std::cout << "Размер: " << numbers.size() << std::endl;
    
    // Итерация
    for (size_t i = 0; i < numbers.size(); i++) {
        std::cout << numbers[i] << " ";
    }
    std::cout << std::endl;
    
    // Итерация через итераторы
    for (auto it = numbers.begin(); it != numbers.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
    
    // Range-based for loop
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

Инициализация вектора

Код:
#include <vector>

int main() {
    // Инициализация с размером
    std::vector<int> vec1(5); // 5 элементов со значением 0
    
    // Инициализация с размером и значением
    std::vector<int> vec2(5, 10); // 5 элементов со значением 10
    
    // Инициализация списком
    std::vector<int> vec3 = {1, 2, 3, 4, 5};
    
    // Копирование другого вектора
    std::vector<int> vec4(vec3);
    
    return 0;
}

Методы vector

Код:
#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3};
    
    // Добавление в конец
    vec.push_back(4);
    
    // Удаление последнего элемента
    vec.pop_back();
    
    // Вставка элемента
    vec.insert(vec.begin() + 1, 99);
    
    // Удаление элемента
    vec.erase(vec.begin() + 1);
    
    // Очистка
    vec.clear();
    
    // Проверка на пустоту
    if (vec.empty()) {
        std::cout << "Вектор пуст" << std::endl;
    }
    
    // Изменение размера
    vec.resize(10);
    
    // Резервирование памяти
    vec.reserve(100);
    
    return 0;
}

Работа с list

Код:
#include <list>
#include <iostream>

int main() {
    // Создание списка
    std::list<int> numbers;
    
    // Добавление элементов
    numbers.push_back(10);
    numbers.push_front(5);
    numbers.push_back(20);
    
    // Итерация
    for (auto it = numbers.begin(); it != numbers.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
    
    // Range-based for loop
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

Методы list

Код:
#include <list>

int main() {
    std::list<int> lst = {1, 2, 3, 4, 5};
    
    // Добавление в начало
    lst.push_front(0);
    
    // Добавление в конец
    lst.push_back(6);
    
    // Вставка элемента
    auto it = lst.begin();
    std::advance(it, 2);
    lst.insert(it, 99);
    
    // Удаление элемента
    lst.erase(it);
    
    // Удаление по значению
    lst.remove(3);
    
    // Удаление дубликатов
    lst.unique();
    
    // Сортировка
    lst.sort();
    
    // Реверс
    lst.reverse();
    
    // Объединение списков
    std::list<int> lst2 = {7, 8, 9};
    lst.merge(lst2);
    
    // Очистка
    lst.clear();
    
    return 0;
}

Сравнение vector и list

Код:
#include <vector>
#include <list>
#include <iostream>
#include <chrono>

int main() {
    const int SIZE = 100000;
    
    // Тест vector
    std::vector<int> vec;
    auto start = std::chrono::high_resolution_clock::now();
    
    for (int i = 0; i < SIZE; i++) {
        vec.push_back(i);
    }
    
    auto end = std::chrono::high_resolution_clock::now();
    auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
    std::cout << "Vector время: " << duration.count() << " микросекунд" << std::endl;
    
    // Тест list
    std::list<int> lst;
    start = std::chrono::high_resolution_clock::now();
    
    for (int i = 0; i < SIZE; i++) {
        lst.push_back(i);
    }
    
    end = std::chrono::high_resolution_clock::now();
    duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
    std::cout << "List время: " << duration.count() << " микросекунд" << std::endl;
    
    return 0;
}

Практический пример: хранение объектов

Код:
#include <vector>
#include <string>
#include <iostream>

class Person {
public:
    std::string name;
    int age;
    
    Person(const std::string& n, int a) : name(n), age(a) {}
};

int main() {
    std::vector<Person> people;
    
    people.push_back(Person("Иван", 25));
    people.push_back(Person("Петр", 30));
    people.push_back(Person("Мария", 28));
    
    for (const auto& person : people) {
        std::cout << person.name << " - " << person.age << " лет" << std::endl;
    }
    
    return 0;
}

Двумерный vector

Код:
#include <vector>
#include <iostream>

int main() {
    // Создание матрицы 3x3
    std::vector<std::vector<int>> matrix(3, std::vector<int>(3, 0));
    
    // Заполнение
    int value = 1;
    for (size_t i = 0; i < matrix.size(); i++) {
        for (size_t j = 0; j < matrix[i].size(); j++) {
            matrix[i][j] = value++;
        }
    }
    
    // Вывод
    for (const auto& row : matrix) {
        for (int val : row) {
            std::cout << val << " ";
        }
        std::cout << std::endl;
    }
    
    return 0;
}

Алгоритмы с контейнерами

Код:
#include <vector>
#include <algorithm>
#include <iostream>

int main() {
    std::vector<int> vec = {5, 2, 8, 1, 9, 3};
    
    // Сортировка
    std::sort(vec.begin(), vec.end());
    
    // Поиск
    auto it = std::find(vec.begin(), vec.end(), 5);
    if (it != vec.end()) {
        std::cout << "Найдено: " << *it << std::endl;
    }
    
    // Подсчет
    int count = std::count(vec.begin(), vec.end(), 3);
    std::cout << "Количество троек: " << count << std::endl;
    
    // Максимальный элемент
    auto maxIt = std::max_element(vec.begin(), vec.end());
    std::cout << "Максимум: " << *maxIt << std::endl;
    
    // Удаление дубликатов
    std::sort(vec.begin(), vec.end());
    vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
    
    return 0;
}

Резервирование памяти

Код:
#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec;
    
    // Резервирование памяти заранее
    vec.reserve(1000);
    
    std::cout << "Емкость: " << vec.capacity() << std::endl;
    std::cout << "Размер: " << vec.size() << std::endl;
    
    // Заполнение
    for (int i = 0; i < 1000; i++) {
        vec.push_back(i);
    }
    
    std::cout << "Емкость после заполнения: " << vec.capacity() << std::endl;
    std::cout << "Размер: " << vec.size() << std::endl;
    
    // Сжатие до необходимого размера
    vec.shrink_to_fit();
    std::cout << "Емкость после сжатия: " << vec.capacity() << std::endl;
    
    return 0;
}

Итераторы и их типы

Код:
#include <vector>
#include <list>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::list<int> lst = {1, 2, 3, 4, 5};
    
    // Обычный итератор
    std::vector<int>::iterator vecIt = vec.begin();
    
    // Константный итератор
    std::vector<int>::const_iterator vecConstIt = vec.cbegin();
    
    // Обратный итератор
    std::vector<int>::reverse_iterator vecRevIt = vec.rbegin();
    
    // Итерация в обратном порядке
    for (auto it = vec.rbegin(); it != vec.rend(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
    
    // Для list доступны только двунаправленные итераторы
    // (нельзя использовать оператор +, только ++ и --)
    auto lstIt = lst.begin();
    std::advance(lstIt, 2); // Перемещение на 2 позиции
    
    return 0;
}

Vector и list - основные контейнеры последовательностей в C++. Выбор зависит от операций, которые вы планируете выполнять чаще всего.
 

1 человек читают эту тему (Всего: 1, Пользователей: 0, Гостей: 1)

Сверху