Активный
- Тема Автор
- #1
Руководство по использованию контейнеров vector и list из стандартной библиотеки C++.
Работа с vector
Инициализация вектора
Методы vector
Работа с list
Методы list
Сравнение vector и list
Практический пример: хранение объектов
Двумерный vector
Алгоритмы с контейнерами
Резервирование памяти
Итераторы и их типы
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++. Выбор зависит от операций, которые вы планируете выполнять чаще всего.