1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//C++ Листинг #1 Итератор ввода #include <algorithm> //нужен для алгоритма for_each #include <iostream> using namespace std; //нужно пространство имен std void printValue(int num){ //эту функцию надо передавать в алгоритм for_each cout << num << "\n"; //выводим параметр функции на экран (num в студию) } int main(){ int Arr[] = {1, 2, 3, 4, 5}; //массив for_each(Arr, Arr + 5, print); //алгоритм for_each принимает три указателя } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
//C++ Листинг #2 Итератор ввода #include <iostream> #include <vector> #include <fstream> using namespace std; int main() { /*СОЗДАЕМ ФАЙЛ*/ const char FName[] = "D:/1.txt"; //Путь должен быть корректным ofstream out(FName); out<<"1\n"; out<<"2\n"; out<<"3\n"; out.close(); /*ИСПОЛЬЗУЯ ИТЕРАТОР ВВОДА, ЗАПИСЫВАЕМ В ВЕКТОР ДАННЫЕ ФАЙЛА*/ ifstream f(FName); vector<char> v((istreambuf_iterator<char>(f)), istreambuf_iterator<char>()); vector<char>::iterator it; for (it=v.begin();it!=v.end();it++){ cout<<*it; } } |
1 2 3 4 5 6 7 8 9 10 |
//C++ Листинг #3 Вывод на экран через итератор вывода #include <iostream> #include <vector> //без этого не сработает using namespace std; //нужное пространство имен int main(){ int Arr[] = {1, 2, 3, 4, 5}; //массив с данными copy(Arr,Arr+5,ostream_iterator<int>(cout,"\n")); //с помощью алгоритма выводим элементы массива в поток cout } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//C++ Листинг #4 Запись в файл с помощью итератора вывода #include <iostream> #include <vector> #include <fstream> using namespace std; int main() { char FName[]="D:/1.txt"; //Имя файла FName char A[3]={'1','2','3'}; //Массив для инициализации вектора vector<char> v(A,A+3); //Копируем массив в вектор ofstream in(FName); //Создаем файловый поток in copy(v.begin(), v.end(), ostream_iterator<char>(in)); //Копируем данные вектора в фаловый поток in in.close(); //заканчиваем работу с файловым потоком in } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//C++ Листинг #5 С помощью итератора вывода выводим значения из вектора в cout #include <iostream> #include <vector> using namespace std; int main() { char A[3]={'1','2','3'}; vector<char> v(A,A+3); copy(v.begin(), v.end(), ostream_iterator<char>(cout)); //Копируем вектор в поток cout с помощью итератора вывода cout<<endl; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//C++ Листинг #6 Однонаправленный итератор #include <algorithm> //Будем использовать алгоритм find #include <iostream> using namespace std; //нужное пространство имен std int main() { int x; //элемент, который будем искать int Arr[ 6 ] = { 27, 210, 12, 47, 109, 83 }; //массив с заданными значениями cout << "Что ищем?: "; cin >> x; //считали с клавиатуры элемент x int *presult = find(Arr, Arr+6, x ); //используем алгоритм find для поиска элемента внутри массива if (presult == Arr+6){ cout << " не найдено" << endl; //если указатель стал указывать на последний элемент, значит не нашлось элемента x } else{ cout << *presult << " найдено" << endl; //если указатель встретил то, что мы попросили, то значит найдено } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//C++ Листинг #7 Однонаправленный итератор #include <algorithm> #include <iostream> using namespace std; int main() { int Arr[]={0,0,0,1,1,1}; replace(Arr, Arr + 6, 0, 2); // сначала поменяем все нули на нейтральное значение replace(Arr, Arr + 6, 1, 0); //потом поменяем все единицы на нули replace(Arr, Arr + 6, 2, 1); //поменяем все нейтральные значения на единицы copy(Arr, Arr + 6, ostream_iterator<int>(cout, "\n")); //выводим массив Arr на экран } |
1 2 3 4 5 6 7 8 9 10 11 |
//C++ Листинг #8 Двунаправленный итератор #include <algorithm> #include <iostream> using namespace std; int main(){ int Arr[] = {1, 2, 3, 4, 5}; //наш массив reverse(Arr, Arr + 5); //реверсивный алгоритм copy(Arr, Arr + 5, ostream_iterator<int>(cout, "\n")); //выводим элементы массива с конца массива } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//C++ Листинг #9 Итератор произвльного доступа #include <vector> //будем использовать вектор #include <iostream> using namespace std; //нужно пространство имен std int main() { int Arr[] = {1, 2, 3, 4, 5}; //массив для записи в вектор vector <int> v(Arr,Arr+5); //копируем массив в вектор vector <int>::iterator it; //объявляем итератор it copy(Arr,Arr+5,it=v.begin()); //используем алгоритм копирования и делаем итератор указателем на начало вектора cout << *( it + 4 ) << endl; //получаем произвольный элемент вектора с помощью итератора произвольного доступа cout << *( it=it + 3 ) << endl; //стараемся испортить вектор, как портили указателями переменные в старые времена cout << *( it=it - 1) << endl; //и выводим при этом значения из вектора на экран cout << *( it-= 1) << endl; copy(v.begin(),v.end(),ostream_iterator<int>(cout," ")); //проверяем вектор. Вектор выжил, гад } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//C++ Листинг #10 Прямой и реверсивный итераторы: #include <vector> //используем вектор #include <iostream> using namespace std; //нужно пространство имен std int main(){ int Arr[] = {1, 2, 3, 4, 5}; //массив для записи в вектор vector <int> v(Arr,Arr+5); //копируем массив в вектор vector <int>::iterator it = v.begin(); //указываем итератору точку старта copy(v.begin(),v.end(),ostream_iterator<int>(cout," ")); //прямой двунаправленный итератор cout<<endl; copy(v.rbegin(),v.rend(),ostream_iterator<int>(cout," ")); //реверсивный двунаправленный итератор cout << endl; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
//C++ Листинг #11 Итераторы вставки (пример на list) #include <algorithm> #include <iostream> #include <list> using namespace std; int main(){ int Arr[] = {0, 0}; //Начальный массив int Arr1[] = {3, 2, 1}; //Массив для первой вставки int Arr2[] = {1, 2, 3}; //Массив для второй вставки int Arr3[] = {1, 1, 1}; //Массив для третей вставки list<int> l(2); //список в два элемента copy(Arr, Arr + 2, l.begin()); //копируем в список начальный массив copy(l.begin(), l.end(), ostream_iterator<int>(cout, " ")); //выводим список на экран cout << " - Список перед вставкой в голову " << endl; //вставка в голову copy(Arr1, Arr1 + 3, front_inserter(l)); //вставляем в голову массив первой вставки copy(l.begin(), l.end(), ostream_iterator<int>(cout, " ")); //выводим массив на экран cout << " - Список перед вставкой в Хвост" << endl; //вставка в хвост copy(Arr2, Arr2 + 3, back_inserter(l)); //вставляем в хвост массив второй вставки copy(l.begin(), l.end(), ostream_iterator<int>(cout, " ")); //выводим список на экран cout << " - список перед вставкой в середину" << endl; //вставка в середину list<int>::iterator it = l.begin(); //Объявляем новый итератор и указываем на начало вектора как на точку старта advance(it, 4); //специальной операцией advance делаем приращение переменной итератора так, чтобы она указывала на четвертый объект в цепочке данных списка copy(Arr3, Arr3 + 3, inserter(l, it)); //вставляем в середину массив третей вставки copy(l.begin(), l.end(), ostream_iterator<int>(cout, " ")); //выводим список на экран cout << endl; } |
1 2 |
//C++ Листинг #12 Константный итератор list<int>::const_iterator it; //итератор it является константным итератором списка list |
Итератор | Описание |
---|---|
для чтения | Читают значения с движением вперед. Могут быть инкрементированы, сравнены и разыменованы. |
для записи | Пишут значения с движением вперед. Могут быть инкрементированы и разыменованы. |
однонаправленные | Читают или пишут значения с движением вперед. Комбинируют функциональность предыдущих двух типов с возможностью сохранять значение итератора. |
двунаправленные | Читают и пишут значения с движением вперед или назад. Похожи на однонаправленные, но их также можно инкрементировать и декрементировать. |
с произвольным доступом | Читают и пишут значения с произвольным доступом. Самые мощные итераторы, сочетающие функциональность двунаправленных итераторов и возможность выполнения арифметики указателей и сравнений указателей. |
обратные | Или итераторы с произвольным доступом, или двунаправленные, движущиеся в обратном направлении. |
Прошу прощения, что-то с тегами не вышло 🙂
А можно такой же разбор только с List?
Я понимаю, что там всё похоже, но всё же.
И желательно, чтобы использовалась структура, а не целые числа/чаровский массив.
Буду очень признательна!
Первый пример, строка 14