Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Задачи охватывают разные аспекты работы с итераторами: обход, поиск, изменение, удаление, вставка, использование с алгоритмами STL и т.д.
- ---
- ### **Задача 1: Вывод элементов вектора с помощью итератора**
- **Условие:** Выведите все элементы `std::vector<int>` с помощью итератора.
- #include <iostream>
- #include <vector>
- using namespace std;
- int main() {
- vector<int> numbers = {10, 20, 30, 40, 50};
- // напишите код ниже
- return 0;
- }
- ---
- ### **Задача 2: Вывод элементов вектора в обратном порядке**
- **Условие:** Выведите элементы `std::vector<int>` в обратном порядке с помощью `rbegin()` и `rend()`.
- #include <iostream>
- #include <vector>
- using namespace std;
- int main() {
- vector<int> numbers = {10, 20, 30, 40, 50};
- // напишите код ниже
- return 0;
- }
- ---
- ### **Задача 3: Поиск элемента в векторе**
- **Условие:** Найдите элемент `30` в векторе и выведите его индекс.
- #include <iostream>
- #include <vector>
- #include <algorithm>
- using namespace std;
- int main() {
- vector<int> numbers = {10, 20, 30, 40, 50};
- // напишите код ниже
- return 0;
- }
- ---
- ### **Задача 4: Удвоить все четные числа в векторе**
- **Условие:** Удвойте все четные числа в `std::vector<int>`.
- #include <iostream>
- #include <vector>
- using namespace std;
- int main() {
- vector<int> numbers = {1, 2, 3, 4, 5, 6};
- // напишите код ниже
- for (int n : numbers) {
- cout << n << " ";
- }
- cout << endl;
- return 0;
- }
- ---
- ### **Задача 5: Удалить все отрицательные числа**
- **Условие:** Удалите все отрицательные числа из `std::vector<int>`.
- #include <iostream>
- #include <vector>
- using namespace std;
- int main() {
- vector<int> numbers = {1, -2, 3, -4, 5};
- // напишите код ниже
- for (int n : numbers) {
- cout << n << " ";
- }
- cout << endl;
- return 0;
- }
- ---
- ### **Задача 6: Вставить элемент перед каждым отрицательным числом**
- **Условие:** Вставьте `0` перед каждым отрицательным числом в векторе.
- #include <iostream>
- #include <vector>
- using namespace std;
- int main() {
- vector<int> numbers = {1, -2, 3, -4, 5};
- // напишите код ниже
- for (int n : numbers) {
- cout << n << " ";
- }
- cout << endl;
- return 0;
- }
- ---
- ### **Задача 7: Найти максимальный элемент с помощью итератора**
- **Условие:** Найдите максимальный элемент в `std::vector<int>` и выведите его.
- #include <iostream>
- #include <vector>
- #include <algorithm>
- using namespace std;
- int main() {
- vector<int> numbers = {10, 50, 30, 20, 40};
- // напишите код ниже
- cout << "Максимальный элемент: " << *max_it << endl;
- return 0;
- }
- ---
- ### **Задача 8: Заменить все вхождения числа**
- **Условие:** Замените все вхождения числа `20` на `99` в векторе.
- #include <iostream>
- #include <vector>
- #include <algorithm>
- using namespace std;
- int main() {
- vector<int> numbers = {10, 20, 30, 20, 40};
- // напишите код ниже
- for (int n : numbers) {
- cout << n << " ";
- }
- cout << endl;
- return 0;
- }
- ---
- ### **Задача 9: Подсчитать количество элементов, равных 30**
- **Условие:** Подсчитайте количество элементов, равных `30`, в векторе.
- #include <iostream>
- #include <vector>
- #include <algorithm>
- using namespace std;
- int main() {
- vector<int> numbers = {10, 30, 30, 40, 30};
- // напишите код ниже
- cout << "Количество элементов 30: " << count << endl;
- return 0;
- }
- ---
- ### **Задача 10: Вывести ключи и значения из `std::map`**
- **Условие:** Выведите ключи и значения из `std::map<string, int>`.
- #include <iostream>
- #include <map>
- using namespace std;
- int main() {
- map<string, int> ages = {{"Alice", 25}, {"Bob", 30}, {"Charlie", 35}};
- // напишите код ниже
- return 0;
- }
- ---
- ### **Задача 11: Удалить все дубликаты из отсортированного вектора**
- **Условие:** Удалите все повторяющиеся элементы из отсортированного `std::vector<int>`, сохранив только первое вхождение.
- **Подсказка:** Используйте `unique()` и `erase()`.
- #include <iostream>
- #include <vector>
- #include <algorithm>
- using namespace std;
- int main() {
- vector<int> numbers = {1, 1, 2, 3, 3, 3, 4, 5, 5};
- // напишите код ниже
- for (int n : numbers) {
- cout << n << " "; // Вывод: 1 2 3 4 5
- }
- cout << endl;
- return 0;
- }
- ---
- ### **Задача 12: Скопировать элементы из одного вектора в другой с помощью итератора**
- **Условие:** Скопируйте все элементы из `vector<int>` в `list<int>` с помощью итераторов.
- #include <iostream>
- #include <vector>
- #include <list>
- #include <algorithm>
- using namespace std;
- int main() {
- vector<int> v = {10, 20, 30, 40};
- list<int> l;
- // напишите код ниже
- for (int n : l) {
- cout << n << " ";
- }
- cout << endl; // Вывод: 10 20 30 40
- return 0;
- }
- ---
- ### **Задача 13: Фильтрация элементов по условию (создание нового контейнера)**
- **Условие:** Создайте новый `vector<int>`, содержащий только числа > 25 из исходного вектора.
- #include <iostream>
- #include <vector>
- #include <algorithm>
- using namespace std;
- int main() {
- vector<int> numbers = {10, 30, 20, 40, 15, 50};
- vector<int> filtered;
- // напишите код ниже
- for (int n : filtered) {
- cout << n << " "; // Вывод: 30 40 50
- }
- cout << endl;
- return 0;
- }
- ---
- ### **Задача 14: Итераторы и константные контейнеры**
- **Условие:** Попробуйте изменить элемент в `const vector<int>`. Почему это не работает? Исправьте код, используя `cbegin()` и `cend()`.
- #include <iostream>
- #include <vector>
- using namespace std;
- int main() {
- const vector<int> numbers = {1, 2, 3, 4, 5};
- // Попытка изменить элемент — ОШИБКА!
- // *numbers.begin() = 10; // НЕ СОБИРАЕТСЯ!
- // Только чтение:
- // напишите код ниже
- cout << endl; // Вывод: 1 2 3 4 5
- return 0;
- }
- ---
- ### **Задача 15: Использование `advance()` и `distance()`**
- **Условие:** Используя `advance()` и `distance()`, найдите третий элемент в векторе и выведите его.
- #include <iostream>
- #include <vector>
- #include <iterator>
- using namespace std;
- int main() {
- vector<int> numbers = {10, 20, 30, 40, 50};
- // напишите код ниже
- cout << "Третий элемент: " << *it << endl; // Вывод: Третий элемент: 30
- // напишите код ниже
- cout << "Индекс: " << pos << endl; // Вывод: Индекс: 2
- return 0;
- }
- ---
- ### **Задача 16: Обход map с использованием структурированного присваивания (C++17)**
- **Условие:** Используя структурированное присваивание (`auto& [key, value]`), выведите все пары ключ-значение из `map`.
- #include <iostream>
- #include <map>
- using namespace std;
- int main() {
- map<string, int> scores = {{"Alice", 85}, {"Bob", 92}, {"Charlie", 78}};
- // напишите код ниже
- // Вывод:
- // Alice: 85
- // Bob: 92
- // Charlie: 78
- return 0;
- }
- ```
- ---
- ### **Задача 17: Удалить элементы из списка, если их значение делится на 3**
- **Условие:** Удалите из `std::list<int>` все элементы, кратные 3.
- #include <iostream>
- #include <list>
- using namespace std;
- int main() {
- list<int> numbers = {3, 6, 9, 10, 12, 15, 17};
- // напишите код ниже
- for (int n : numbers) {
- cout << n << " "; // Вывод: 10 17
- }
- cout << endl;
- return 0;
- }
- ---
- ### **Задача 18: Итераторы и алгоритм `transform()`**
- **Условие:** Используйте `transform()` для возведения всех элементов `vector<int>` в квадрат и сохраните результат в другой вектор.
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <cmath>
- using namespace std;
- int main() {
- vector<int> numbers = {1, 2, 3, 4};
- vector<int> squares(numbers.size());
- transform(numbers.begin(), numbers.end(), squares.begin(),
- [](int x) { return x * x; });
- for (int n : squares) {
- cout << n << " "; // Вывод: 1 4 9 16
- }
- cout << endl;
- return 0;
- }
- ```
- ---
- ### **Задача 19: Создание итератора для пользовательского типа**
- **Условие:** Создайте класс `Student` с полем `grade`. Создайте вектор студентов и выведите всех, у кого оценка ≥ 4.
- **Решение:**
- ```cpp
- #include <iostream>
- #include <vector>
- using namespace std;
- class Student {
- // напишите код ниже
- };
- int main() {
- vector<Student> students = {
- {"Alice", 5},
- {"Bob", 3},
- {"Charlie", 4},
- {"Diana", 2}
- };
- // напишите код ниже
- // Вывод:
- // Alice (5)
- // Charlie (4)
- return 0;
- }
- ```
- ---
- ### **Задача 20: Ловушка! Почему программа аварийно завершается?**
- **Условие:** Объясните, почему этот код падает, и исправьте его.
- #include <iostream>
- #include <vector>
- using namespace std;
- int main() {
- vector<int> v = {10, 20, 30};
- auto it = v.begin();
- v.push_back(40); // Добавляем элемент
- cout << *it << endl; // ОШИБКА!
- return 0;
- }
- **Подсказка:**
- Метод `push_back()` может вызвать **перераспределение памяти** в `vector`, если не хватает места. При этом **все итераторы, указатели и ссылки на элементы становятся недействительными**. Это частая ошибка новичков!
- ---
- ## ✅ Итоговая таблица: Что вы освоили?
- | Номер | Навык |
- |-------|------|
- | 1–3 | Базовый обход контейнеров |
- | 4–6 | Изменение и вставка элементов |
- | 7–9 | Поиск, подсчёт, замена |
- | 10–11 | Работа с map и удаление дубликатов |
- | 12 | Копирование между контейнерами |
- | 13 | Фильтрация данных |
- | 14 | Константные итераторы |
- | 15 | `advance()`, `distance()` |
- | 16 | Структурированное присваивание (C++17) |
- | 17 | Удаление из list |
- | 18 | `transform()` и лямбды |
- | 19 | Работа с пользовательскими типами |
- | 20 | Понимание инвалидации итераторов |
- ---
- ## 💡 Советы:
- 1. **Никогда не предполагайте, что итератор останется валидным** после изменения контейнера (особенно `vector`, `string`).
- 2. Всегда проверяйте, не вышел ли итератор за `end()`.
- 3. Используйте `cbegin()`/`cend()` для чтения — это безопаснее.
- 4. Алгоритмы STL (`find`, `count`, `transform`, `remove_if`) работают с итераторами — научитесь ими пользоваться!
- 5. При удалении в цикле — **всегда присваивайте результат `erase()`** обратно итератору.
- ---
Advertisement
Add Comment
Please, Sign In to add comment