@craig.emmerich
Итератор в C++11 может быть реализован с помощью новых функций, таких как begin
и end
, которые возвращают итераторы указывающие на начало и конец контейнера соответственно. Класс итератора должен иметь следующие методы:
Ниже приведен пример реализации итератора для стека:
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 |
template class Stack { private: struct Node { T data; Node* next; Node(const T& data, Node* next = nullptr) : data(data), next(next) {} }; Node* head; size_t size; public: Stack() : head(nullptr), size(0) {} ~Stack() { while (!empty()) pop(); } void push(const T& data) { head = new Node(data, head); size++; } void pop() { if (!empty()) { Node* temp = head; head = head->next; delete temp; size--; } } T top() const { return head->data; } bool empty() const { return head == nullptr; } size_t getSize() const { return size; } // класс итератора class Iterator { private: Node* node; public: Iterator(Node* node) : node(node) {} Iterator& operator++() { node = node->next; return *this; } T& operator*() { return node->data; } bool operator!=(const Iterator& other) const { return node != other.node; } }; Iterator begin() { return Iterator(head); } Iterator end() { return Iterator(nullptr); } }; |
Пример использования:
1 2 3 4 5 6 7 8 |
Stack stack; stack.push(1); stack.push(2); stack.push(3); for (auto it = stack.begin(); it != stack.end(); ++it) { std::cout << *it << ' '; // выводит: 3 2 1 } |
@craig.emmerich
В приведенном выше примере реализован класс Stack
, включающий в себя итератор Iterator
. Класс Iterator
определен внутри класса Stack
, что обеспечивает доступ к приватным данным класса Stack
. Итератор реализован с использованием методов operator++()
, operator*()
и operator!=()
. Метод begin()
возвращает итератор, указывающий на первый элемент стека, а метод end()
возвращает итератор, указывающий на пустой элемент.Таким образом, создание пользовательского итератора позволяет более удобно итерироваться по структурам данных, созданным программистом.
@craig.emmerich
Пример, представленный выше, демонстрирует, как реализовать пользовательский итератор для стека в C++11. Однако стоит отметить, что в стандартной библиотеке C++ также существуют контейнеры, предоставляющие свои встроенные итераторы, такие как std::vector, std::list, std::map и другие. При использовании таких контейнеров встроенные итераторы уже реализованы, и нет необходимости создавать пользовательские итераторы.
Кроме того, начиная с C++11, также доступны встроенные алгоритмы стандартной библиотеки, такие как std::for_each, std::transform, std::find и другие, которые позволяют проходить по контейнерам без явного использования итераторов. Вместо этого, передается функция или лямбда-выражение, которые будут применены к каждому элементу контейнера.
Таким образом, создание пользовательских итераторов в C++11 может быть полезным в случаях, когда необходимо работать с собственной структурой данных или осуществлять сложные манипуляции с итерациями, однако часто можно обойтись и без них, используя возможности стандартной библиотеки C++.