stl迭代器的语法是如何实现的?

时间:2010-05-31 16:43:29

标签: c++ stl iterator

我一直在空闲时间写一个库来熟悉c ++和奇异值分解。我一直在写一个Iterator类,我完全有能力编写这个功能,而且我已经拥有了我自己当前的MatrixIterator类。我猜它涉及名称空间,因为:

vector<int>::iterator

似乎是命名空间向量的迭代器,但命名空间是另一个我不熟悉的主题。

主要是我在问它实现迭代器会涉及到什么,以便以类似于stl迭代器的方式引用它。我也知道我可以使用boost.iterators或类似的东西来节省很多工作,但我更感兴趣的是学习所有类似的细节。

4 个答案:

答案 0 :(得分:3)

不,这与名称空间无关。它只是一个类中的typedef:

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

一旦有了迭代器类,就需要实现几个运算符。对于前向迭代器,它将是:

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

如果你想要一个可以完全参与STL其余部分的迭代器,你还需要做一些事情,例如给它一个类别。

答案 1 :(得分:2)

通常它是容器内的嵌套类或通过::访问的typedef。

Web上有大量带有迭代器的类样本(我不建议调查STL实现,因为如果你第一次看到它就很难理解。)

您可以查看STX Btree实现,以查看设计良好的迭代器示例。

答案 2 :(得分:1)

vector<int>class而非namespace(重要区别),定义如下:

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

其中some_type也很可能是friend向量,甚至是成员类

答案 3 :(得分:0)

::运算符不仅访问命名空间;它还可以访问类的typedef,静态成员,枚举等。

#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);
}