Задачи охватывают разные аспекты работы с итераторами: обход, поиск, изменение, удаление, вставка, использование с алгоритмами STL и т.д. --- ### **Задача 1: Вывод элементов вектора с помощью итератора** **Условие:** Выведите все элементы `std::vector` с помощью итератора. #include #include using namespace std; int main() { vector numbers = {10, 20, 30, 40, 50}; // напишите код ниже return 0; } --- ### **Задача 2: Вывод элементов вектора в обратном порядке** **Условие:** Выведите элементы `std::vector` в обратном порядке с помощью `rbegin()` и `rend()`. #include #include using namespace std; int main() { vector numbers = {10, 20, 30, 40, 50}; // напишите код ниже return 0; } --- ### **Задача 3: Поиск элемента в векторе** **Условие:** Найдите элемент `30` в векторе и выведите его индекс. #include #include #include using namespace std; int main() { vector numbers = {10, 20, 30, 40, 50}; // напишите код ниже return 0; } --- ### **Задача 4: Удвоить все четные числа в векторе** **Условие:** Удвойте все четные числа в `std::vector`. #include #include using namespace std; int main() { vector numbers = {1, 2, 3, 4, 5, 6}; // напишите код ниже for (int n : numbers) { cout << n << " "; } cout << endl; return 0; } --- ### **Задача 5: Удалить все отрицательные числа** **Условие:** Удалите все отрицательные числа из `std::vector`. #include #include using namespace std; int main() { vector numbers = {1, -2, 3, -4, 5}; // напишите код ниже for (int n : numbers) { cout << n << " "; } cout << endl; return 0; } --- ### **Задача 6: Вставить элемент перед каждым отрицательным числом** **Условие:** Вставьте `0` перед каждым отрицательным числом в векторе. #include #include using namespace std; int main() { vector numbers = {1, -2, 3, -4, 5}; // напишите код ниже for (int n : numbers) { cout << n << " "; } cout << endl; return 0; } --- ### **Задача 7: Найти максимальный элемент с помощью итератора** **Условие:** Найдите максимальный элемент в `std::vector` и выведите его. #include #include #include using namespace std; int main() { vector numbers = {10, 50, 30, 20, 40}; // напишите код ниже cout << "Максимальный элемент: " << *max_it << endl; return 0; } --- ### **Задача 8: Заменить все вхождения числа** **Условие:** Замените все вхождения числа `20` на `99` в векторе. #include #include #include using namespace std; int main() { vector numbers = {10, 20, 30, 20, 40}; // напишите код ниже for (int n : numbers) { cout << n << " "; } cout << endl; return 0; } --- ### **Задача 9: Подсчитать количество элементов, равных 30** **Условие:** Подсчитайте количество элементов, равных `30`, в векторе. #include #include #include using namespace std; int main() { vector numbers = {10, 30, 30, 40, 30}; // напишите код ниже cout << "Количество элементов 30: " << count << endl; return 0; } --- ### **Задача 10: Вывести ключи и значения из `std::map`** **Условие:** Выведите ключи и значения из `std::map`. #include #include using namespace std; int main() { map ages = {{"Alice", 25}, {"Bob", 30}, {"Charlie", 35}}; // напишите код ниже return 0; } --- ### **Задача 11: Удалить все дубликаты из отсортированного вектора** **Условие:** Удалите все повторяющиеся элементы из отсортированного `std::vector`, сохранив только первое вхождение. **Подсказка:** Используйте `unique()` и `erase()`. #include #include #include using namespace std; int main() { vector 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` в `list` с помощью итераторов. #include #include #include #include using namespace std; int main() { vector v = {10, 20, 30, 40}; list l; // напишите код ниже for (int n : l) { cout << n << " "; } cout << endl; // Вывод: 10 20 30 40 return 0; } --- ### **Задача 13: Фильтрация элементов по условию (создание нового контейнера)** **Условие:** Создайте новый `vector`, содержащий только числа > 25 из исходного вектора. #include #include #include using namespace std; int main() { vector numbers = {10, 30, 20, 40, 15, 50}; vector filtered; // напишите код ниже for (int n : filtered) { cout << n << " "; // Вывод: 30 40 50 } cout << endl; return 0; } --- ### **Задача 14: Итераторы и константные контейнеры** **Условие:** Попробуйте изменить элемент в `const vector`. Почему это не работает? Исправьте код, используя `cbegin()` и `cend()`. #include #include using namespace std; int main() { const vector numbers = {1, 2, 3, 4, 5}; // Попытка изменить элемент — ОШИБКА! // *numbers.begin() = 10; // НЕ СОБИРАЕТСЯ! // Только чтение: // напишите код ниже cout << endl; // Вывод: 1 2 3 4 5 return 0; } --- ### **Задача 15: Использование `advance()` и `distance()`** **Условие:** Используя `advance()` и `distance()`, найдите третий элемент в векторе и выведите его. #include #include #include using namespace std; int main() { vector 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 #include using namespace std; int main() { map scores = {{"Alice", 85}, {"Bob", 92}, {"Charlie", 78}}; // напишите код ниже // Вывод: // Alice: 85 // Bob: 92 // Charlie: 78 return 0; } ``` --- ### **Задача 17: Удалить элементы из списка, если их значение делится на 3** **Условие:** Удалите из `std::list` все элементы, кратные 3. #include #include using namespace std; int main() { list numbers = {3, 6, 9, 10, 12, 15, 17}; // напишите код ниже for (int n : numbers) { cout << n << " "; // Вывод: 10 17 } cout << endl; return 0; } --- ### **Задача 18: Итераторы и алгоритм `transform()`** **Условие:** Используйте `transform()` для возведения всех элементов `vector` в квадрат и сохраните результат в другой вектор. #include #include #include #include using namespace std; int main() { vector numbers = {1, 2, 3, 4}; vector 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 #include using namespace std; class Student { // напишите код ниже }; int main() { vector students = { {"Alice", 5}, {"Bob", 3}, {"Charlie", 4}, {"Diana", 2} }; // напишите код ниже // Вывод: // Alice (5) // Charlie (4) return 0; } ``` --- ### **Задача 20: Ловушка! Почему программа аварийно завершается?** **Условие:** Объясните, почему этот код падает, и исправьте его. #include #include using namespace std; int main() { vector 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()`** обратно итератору. ---