Как реализован синтаксис для итераторов stl? - PullRequest
2 голосов
/ 31 мая 2010

В свободное время я работал над написанием библиотеки, чтобы больше узнать о c ++ и разложении по сингулярным значениям. Я работал над написанием класса Iterator, и я полностью способен написать функциональность, и у меня уже есть свой собственный класс MatrixIterator. Я предполагаю, что это включает в себя пространства имен, потому что:

vector<int>::iterator

Может показаться, что это итератор из вектора пространства имен, но пространства имен - это еще одна тема, с которой я не знаком.

В основном я спрашиваю, что это будет включать в себя для реализации итератора, чтобы на него можно было ссылаться аналогично итераторам stl. Я также знаю, что мог бы использовать boost.iterators или что-то подобное, чтобы сэкономить мне много работы, но мне больше интересно узнать все детали, связанные с чем-то вроде этого.

Ответы [ 4 ]

3 голосов
/ 31 мая 2010

Нет, это не имеет ничего общего с пространствами имен. Это просто typedef внутри класса:

template <typename T>
class container
{
public:
    typedef ... iterator;
};

Когда у вас есть класс итератора, вам нужно реализовать несколько операторов. Для прямого итератора это будет:

operator*();
operator++();
operator==(const TYPE &other);

Если вам нужен итератор, который может полностью участвовать с остальными STL, вам нужно сделать и другие вещи, например присвоить ему категорию.

2 голосов
/ 31 мая 2010

Обычно это вложенный класс внутри вашего контейнера или typedef, доступ к которому осуществляется через ::.

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

Вы можете взглянуть на реализацию STX Btree , чтобы увидеть хорошо разработанный образец итератора.

1 голос
/ 31 мая 2010

vector<int> - это class, а не namespace (важное различие), определение имеет вид:

template<typename T>
class vector{
    public:
        typedef some_type iterator;
    ...
};

, где some_type также, скорее всего, будет friend вектора или даже класса члена

0 голосов
/ 31 мая 2010

Оператор :: имеет доступ не только к пространствам имен; он также обращается к typedefs, статическим членам, перечислениям и т. д. класса.

#include <iostream>

template <typename T>
class Foo
{
    public:
        static void write(T t)
        {
            std::cout << t << std::endl;
        }

        typedef T thing;
};

int main()
{
    Foo<int>::thing my_thing = 42;
    Foo<int>::write(my_thing);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...