Реализация дорогого итератора C++

Предположим, у нас есть такой класс:

#include <cstdio>

struct A{
    struct it{
        it(int i) : i(i){
            printf("c-tor %d\n", i);
        }

        it &operator++(){
            i++;
            return *this;
        }

        int operator*(){
            return i;
        }

        bool operator!=(const it &ot){
            return i != ot.i;
        }

        int i;
    };

    it begin() const{
        return it(0);
    }

    it end() const{
        return it(10);
    }

    it end_it = it(10);

    const it &xend() const{
        return end_it;
    }

};

int main(){
    A a;

    printf("for\n");
    for(A::it i = a.begin(); i != a.end(); ++i)
        printf("%d\n", *i);


    printf("c++11 for\n");
    for(int j : a)
        printf("%d\n", j);


    printf("memoize\n");
    A::it my_end = a.end();

    for(A::it i = a.begin(); i != my_end; ++i)
        printf("%d\n", *i);


    printf("ref\n");
    for(A::it i = a.begin(); i != a.xend(); ++i)
        printf("%d\n", *i);
}

РЕДАКТИРОВАТЬ: итератор является постоянным итератором. В примере это очень просто, и это не очевидно.

Когда мы делаем первый цикл for, для каждой итерации цикла создается новый конечный итератор.

Если мы присвоим класс из end() переменной (например, memoize), такой проблемы не будет.

C++11, вероятно, делает то же самое.

В заключение, end() может возвращать ссылку, но код намного сложнее и, вероятно, создаст проблемы в будущем.

Как правильно реализовать дорогой итератор?

1 ответ

Решение

Посмотрите, как Херб Саттер получил временные объекты. Он предлагает вам позвонить end() только один раз, прежде чем войти в цикл, избегая вызова end() за каждую итерацию.

Однако он предлагает измерить, является ли временное создание итератора узким местом производительности (например, оно может быть очень быстрым или даже оптимизировано компилятором), чтобы избежать преждевременной оптимизации.

Определение: преждевременная оптимизация - это когда вы делаете код более сложным во имя эффективности без данных, которые ему действительно необходимы.

Другие вопросы по тегам