kutuzzzov

Задачи на тему итераторы

Nov 19th, 2025
407
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.35 KB | None | 0 0
  1. Задачи охватывают разные аспекты работы с итераторами: обход, поиск, изменение, удаление, вставка, использование с алгоритмами STL и т.д.
  2.  
  3. ---
  4.  
  5. ### **Задача 1: Вывод элементов вектора с помощью итератора**
  6. **Условие:** Выведите все элементы `std::vector<int>` с помощью итератора.
  7.  
  8. #include <iostream>
  9. #include <vector>
  10. using namespace std;
  11.  
  12. int main() {
  13.     vector<int> numbers = {10, 20, 30, 40, 50};
  14.  
  15.     // напишите код ниже
  16.  
  17.     return 0;
  18. }
  19.  
  20.  
  21. ---
  22.  
  23. ### **Задача 2: Вывод элементов вектора в обратном порядке**
  24. **Условие:** Выведите элементы `std::vector<int>` в обратном порядке с помощью `rbegin()` и `rend()`.
  25.  
  26. #include <iostream>
  27. #include <vector>
  28. using namespace std;
  29.  
  30. int main() {
  31.     vector<int> numbers = {10, 20, 30, 40, 50};
  32.  
  33.     // напишите код ниже
  34.  
  35.     return 0;
  36. }
  37.  
  38.  
  39. ---
  40.  
  41. ### **Задача 3: Поиск элемента в векторе**
  42. **Условие:** Найдите элемент `30` в векторе и выведите его индекс.
  43.  
  44. #include <iostream>
  45. #include <vector>
  46. #include <algorithm>
  47. using namespace std;
  48.  
  49. int main() {
  50.     vector<int> numbers = {10, 20, 30, 40, 50};
  51.  
  52.     // напишите код ниже
  53.  
  54.     return 0;
  55. }
  56.  
  57.  
  58. ---
  59.  
  60. ### **Задача 4: Удвоить все четные числа в векторе**
  61. **Условие:** Удвойте все четные числа в `std::vector<int>`.
  62.  
  63. #include <iostream>
  64. #include <vector>
  65. using namespace std;
  66.  
  67. int main() {
  68.     vector<int> numbers = {1, 2, 3, 4, 5, 6};
  69.  
  70.     // напишите код ниже
  71.  
  72.     for (int n : numbers) {
  73.         cout << n << " ";
  74.     }
  75.     cout << endl;
  76.     return 0;
  77. }
  78.  
  79.  
  80. ---
  81.  
  82. ### **Задача 5: Удалить все отрицательные числа**
  83. **Условие:** Удалите все отрицательные числа из `std::vector<int>`.
  84.  
  85. #include <iostream>
  86. #include <vector>
  87. using namespace std;
  88.  
  89. int main() {
  90.     vector<int> numbers = {1, -2, 3, -4, 5};
  91.  
  92.     // напишите код ниже
  93.  
  94.     for (int n : numbers) {
  95.         cout << n << " ";
  96.     }
  97.     cout << endl;
  98.     return 0;
  99. }
  100.  
  101.  
  102. ---
  103.  
  104. ### **Задача 6: Вставить элемент перед каждым отрицательным числом**
  105. **Условие:** Вставьте `0` перед каждым отрицательным числом в векторе.
  106.  
  107. #include <iostream>
  108. #include <vector>
  109. using namespace std;
  110.  
  111. int main() {
  112.     vector<int> numbers = {1, -2, 3, -4, 5};
  113.  
  114.     // напишите код ниже
  115.  
  116.     for (int n : numbers) {
  117.         cout << n << " ";
  118.     }
  119.     cout << endl;
  120.     return 0;
  121. }
  122.  
  123.  
  124. ---
  125.  
  126. ### **Задача 7: Найти максимальный элемент с помощью итератора**
  127. **Условие:** Найдите максимальный элемент в `std::vector<int>` и выведите его.
  128.  
  129. #include <iostream>
  130. #include <vector>
  131. #include <algorithm>
  132. using namespace std;
  133.  
  134. int main() {
  135.     vector<int> numbers = {10, 50, 30, 20, 40};
  136.  
  137.     // напишите код ниже
  138.  
  139.     cout << "Максимальный элемент: " << *max_it << endl;
  140.     return 0;
  141. }
  142.  
  143.  
  144. ---
  145.  
  146. ### **Задача 8: Заменить все вхождения числа**
  147. **Условие:** Замените все вхождения числа `20` на `99` в векторе.
  148.  
  149. #include <iostream>
  150. #include <vector>
  151. #include <algorithm>
  152. using namespace std;
  153.  
  154. int main() {
  155.     vector<int> numbers = {10, 20, 30, 20, 40};
  156.  
  157.     // напишите код ниже
  158.  
  159.     for (int n : numbers) {
  160.         cout << n << " ";
  161.     }
  162.     cout << endl;
  163.     return 0;
  164. }
  165.  
  166.  
  167. ---
  168.  
  169. ### **Задача 9: Подсчитать количество элементов, равных 30**
  170. **Условие:** Подсчитайте количество элементов, равных `30`, в векторе.
  171.  
  172. #include <iostream>
  173. #include <vector>
  174. #include <algorithm>
  175. using namespace std;
  176.  
  177. int main() {
  178.     vector<int> numbers = {10, 30, 30, 40, 30};
  179.  
  180.     // напишите код ниже
  181.  
  182.     cout << "Количество элементов 30: " << count << endl;
  183.     return 0;
  184. }
  185.  
  186.  
  187. ---
  188.  
  189. ### **Задача 10: Вывести ключи и значения из `std::map`**
  190. **Условие:** Выведите ключи и значения из `std::map<string, int>`.
  191.  
  192. #include <iostream>
  193. #include <map>
  194. using namespace std;
  195.  
  196. int main() {
  197.     map<string, int> ages = {{"Alice", 25}, {"Bob", 30}, {"Charlie", 35}};
  198.  
  199.     // напишите код ниже
  200.  
  201.     return 0;
  202. }
  203.  
  204.  
  205. ---
  206.  
  207.  
  208. ### **Задача 11: Удалить все дубликаты из отсортированного вектора**
  209. **Условие:** Удалите все повторяющиеся элементы из отсортированного `std::vector<int>`, сохранив только первое вхождение.
  210. **Подсказка:** Используйте `unique()` и `erase()`.
  211.  
  212.  
  213. #include <iostream>
  214. #include <vector>
  215. #include <algorithm>
  216. using namespace std;
  217.  
  218. int main() {
  219.     vector<int> numbers = {1, 1, 2, 3, 3, 3, 4, 5, 5};
  220.  
  221.     // напишите код ниже
  222.  
  223.     for (int n : numbers) {
  224.         cout << n << " "; // Вывод: 1 2 3 4 5
  225.     }
  226.     cout << endl;
  227.     return 0;
  228. }
  229.  
  230.  
  231. ---
  232.  
  233. ### **Задача 12: Скопировать элементы из одного вектора в другой с помощью итератора**
  234. **Условие:** Скопируйте все элементы из `vector<int>` в `list<int>` с помощью итераторов.
  235.  
  236. #include <iostream>
  237. #include <vector>
  238. #include <list>
  239. #include <algorithm>
  240. using namespace std;
  241.  
  242. int main() {
  243.     vector<int> v = {10, 20, 30, 40};
  244.     list<int> l;
  245.  
  246.     // напишите код ниже
  247.  
  248.     for (int n : l) {
  249.         cout << n << " ";
  250.     }
  251.     cout << endl; // Вывод: 10 20 30 40
  252.     return 0;
  253. }
  254.  
  255.  
  256. ---
  257.  
  258. ### **Задача 13: Фильтрация элементов по условию (создание нового контейнера)**
  259. **Условие:** Создайте новый `vector<int>`, содержащий только числа > 25 из исходного вектора.
  260.  
  261. #include <iostream>
  262. #include <vector>
  263. #include <algorithm>
  264. using namespace std;
  265.  
  266. int main() {
  267.     vector<int> numbers = {10, 30, 20, 40, 15, 50};
  268.     vector<int> filtered;
  269.  
  270.     // напишите код ниже
  271.  
  272.     for (int n : filtered) {
  273.         cout << n << " "; // Вывод: 30 40 50
  274.     }
  275.     cout << endl;
  276.     return 0;
  277. }
  278.  
  279.  
  280. ---
  281.  
  282. ### **Задача 14: Итераторы и константные контейнеры**
  283. **Условие:** Попробуйте изменить элемент в `const vector<int>`. Почему это не работает? Исправьте код, используя `cbegin()` и `cend()`.
  284.  
  285. #include <iostream>
  286. #include <vector>
  287. using namespace std;
  288.  
  289. int main() {
  290.     const vector<int> numbers = {1, 2, 3, 4, 5};
  291.  
  292.     // Попытка изменить элемент — ОШИБКА!
  293.     // *numbers.begin() = 10; // НЕ СОБИРАЕТСЯ!
  294.  
  295.     // Только чтение:
  296.     // напишите код ниже
  297.  
  298.     cout << endl; // Вывод: 1 2 3 4 5
  299.     return 0;
  300. }
  301.  
  302.  
  303. ---
  304.  
  305. ### **Задача 15: Использование `advance()` и `distance()`**
  306. **Условие:** Используя `advance()` и `distance()`, найдите третий элемент в векторе и выведите его.
  307.  
  308. #include <iostream>
  309. #include <vector>
  310. #include <iterator>
  311. using namespace std;
  312.  
  313. int main() {
  314.     vector<int> numbers = {10, 20, 30, 40, 50};
  315.  
  316.     // напишите код ниже
  317.  
  318.     cout << "Третий элемент: " << *it << endl; // Вывод: Третий элемент: 30
  319.  
  320.     // напишите код ниже
  321.  
  322.     cout << "Индекс: " << pos << endl; // Вывод: Индекс: 2
  323.     return 0;
  324. }
  325.  
  326.  
  327. ---
  328.  
  329. ### **Задача 16: Обход map с использованием структурированного присваивания (C++17)**
  330. **Условие:** Используя структурированное присваивание (`auto& [key, value]`), выведите все пары ключ-значение из `map`.
  331.  
  332. #include <iostream>
  333. #include <map>
  334. using namespace std;
  335.  
  336. int main() {
  337.     map<string, int> scores = {{"Alice", 85}, {"Bob", 92}, {"Charlie", 78}};
  338.  
  339.     // напишите код ниже
  340.  
  341.     // Вывод:
  342.     // Alice: 85
  343.     // Bob: 92
  344.     // Charlie: 78
  345.     return 0;
  346. }
  347. ```
  348.  
  349. ---
  350.  
  351. ### **Задача 17: Удалить элементы из списка, если их значение делится на 3**
  352. **Условие:** Удалите из `std::list<int>` все элементы, кратные 3.
  353.  
  354. #include <iostream>
  355. #include <list>
  356. using namespace std;
  357.  
  358. int main() {
  359.     list<int> numbers = {3, 6, 9, 10, 12, 15, 17};
  360.  
  361.     // напишите код ниже
  362.  
  363.     for (int n : numbers) {
  364.         cout << n << " "; // Вывод: 10 17
  365.     }
  366.     cout << endl;
  367.     return 0;
  368. }
  369.  
  370.  
  371. ---
  372.  
  373. ### **Задача 18: Итераторы и алгоритм `transform()`**
  374. **Условие:** Используйте `transform()` для возведения всех элементов `vector<int>` в квадрат и сохраните результат в другой вектор.
  375.  
  376. #include <iostream>
  377. #include <vector>
  378. #include <algorithm>
  379. #include <cmath>
  380. using namespace std;
  381.  
  382. int main() {
  383.     vector<int> numbers = {1, 2, 3, 4};
  384.     vector<int> squares(numbers.size());
  385.  
  386.     transform(numbers.begin(), numbers.end(), squares.begin(),
  387.               [](int x) { return x * x; });
  388.  
  389.     for (int n : squares) {
  390.         cout << n << " "; // Вывод: 1 4 9 16
  391.     }
  392.     cout << endl;
  393.     return 0;
  394. }
  395. ```
  396.  
  397. ---
  398.  
  399. ### **Задача 19: Создание итератора для пользовательского типа**
  400. **Условие:** Создайте класс `Student` с полем `grade`. Создайте вектор студентов и выведите всех, у кого оценка ≥ 4.
  401. **Решение:**
  402. ```cpp
  403. #include <iostream>
  404. #include <vector>
  405. using namespace std;
  406.  
  407. class Student {
  408. // напишите код ниже
  409.  
  410. };
  411.  
  412. int main() {
  413.     vector<Student> students = {
  414.         {"Alice", 5},
  415.         {"Bob", 3},
  416.         {"Charlie", 4},
  417.         {"Diana", 2}
  418.     };
  419.  
  420.     // напишите код ниже
  421.  
  422.     // Вывод:
  423.     // Alice (5)
  424.     // Charlie (4)
  425.     return 0;
  426. }
  427. ```
  428.  
  429. ---
  430.  
  431. ### **Задача 20: Ловушка! Почему программа аварийно завершается?**
  432. **Условие:** Объясните, почему этот код падает, и исправьте его.
  433.  
  434. #include <iostream>
  435. #include <vector>
  436. using namespace std;
  437.  
  438. int main() {
  439.     vector<int> v = {10, 20, 30};
  440.     auto it = v.begin();
  441.     v.push_back(40); // Добавляем элемент
  442.     cout << *it << endl; // ОШИБКА!
  443.     return 0;
  444. }
  445.  
  446. **Подсказка:**  
  447. Метод `push_back()` может вызвать **перераспределение памяти** в `vector`, если не хватает места. При этом **все итераторы, указатели и ссылки на элементы становятся недействительными**. Это частая ошибка новичков!
  448.  
  449. ---
  450.  
  451. ## ✅ Итоговая таблица: Что вы освоили?
  452.  
  453. | Номер | Навык |
  454. |-------|------|
  455. | 13 | Базовый обход контейнеров |
  456. | 46 | Изменение и вставка элементов |
  457. | 79 | Поиск, подсчёт, замена |
  458. | 1011 | Работа с map и удаление дубликатов |
  459. | 12 | Копирование между контейнерами |
  460. | 13 | Фильтрация данных |
  461. | 14 | Константные итераторы |
  462. | 15 | `advance()`, `distance()` |
  463. | 16 | Структурированное присваивание (C++17) |
  464. | 17 | Удаление из list |
  465. | 18 | `transform()` и лямбды |
  466. | 19 | Работа с пользовательскими типами |
  467. | 20 | Понимание инвалидации итераторов |
  468.  
  469. ---
  470.  
  471. ## 💡 Советы:
  472. 1. **Никогда не предполагайте, что итератор останется валидным** после изменения контейнера (особенно `vector`, `string`).
  473. 2. Всегда проверяйте, не вышел ли итератор за `end()`.
  474. 3. Используйте `cbegin()`/`cend()` для чтения — это безопаснее.
  475. 4. Алгоритмы STL (`find`, `count`, `transform`, `remove_if`) работают с итераторами — научитесь ими пользоваться!
  476. 5. При удалении в цикле — **всегда присваивайте результат `erase()`** обратно итератору.
  477.  
  478. ---
Advertisement
Add Comment
Please, Sign In to add comment