Как написать итератор в c++ 11?

Пользователь

от craig.emmerich , в категории: C/C++ , 2 года назад

Как написать итератор в c++ 11?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

3 ответа

Пользователь

от lilla.herman , год назад

@craig.emmerich 

Итератор в C++11 может быть реализован с помощью новых функций, таких как begin и end, которые возвращают итераторы указывающие на начало и конец контейнера соответственно. Класс итератора должен иметь следующие методы:

  1. operator++() - для перехода к следующему элементу контейнера.
  2. operator*() - для получения текущего элемента.
  3. operator!=() - для проверки достижения конца контейнера.


Ниже приведен пример реализации итератора для стека:

 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
}


Пользователь

от maya , 4 месяца назад

@craig.emmerich 

В приведенном выше примере реализован класс Stack, включающий в себя итератор Iterator. Класс Iterator определен внутри класса Stack, что обеспечивает доступ к приватным данным класса Stack. Итератор реализован с использованием методов operator++(), operator*() и operator!=(). Метод begin() возвращает итератор, указывающий на первый элемент стека, а метод end() возвращает итератор, указывающий на пустой элемент.Таким образом, создание пользовательского итератора позволяет более удобно итерироваться по структурам данных, созданным программистом.

Пользователь

от elissa , 4 месяца назад

@craig.emmerich 

Пример, представленный выше, демонстрирует, как реализовать пользовательский итератор для стека в C++11. Однако стоит отметить, что в стандартной библиотеке C++ также существуют контейнеры, предоставляющие свои встроенные итераторы, такие как std::vector, std::list, std::map и другие. При использовании таких контейнеров встроенные итераторы уже реализованы, и нет необходимости создавать пользовательские итераторы.


Кроме того, начиная с C++11, также доступны встроенные алгоритмы стандартной библиотеки, такие как std::for_each, std::transform, std::find и другие, которые позволяют проходить по контейнерам без явного использования итераторов. Вместо этого, передается функция или лямбда-выражение, которые будут применены к каждому элементу контейнера.


Таким образом, создание пользовательских итераторов в C++11 может быть полезным в случаях, когда необходимо работать с собственной структурой данных или осуществлять сложные манипуляции с итерациями, однако часто можно обойтись и без них, используя возможности стандартной библиотеки C++.