我一直在空闲时间写一个库来熟悉c ++和奇异值分解。我一直在写一个Iterator类,我完全有能力编写这个功能,而且我已经拥有了我自己当前的MatrixIterator类。我猜它涉及名称空间,因为:
vector<int>::iterator
似乎是命名空间向量的迭代器,但命名空间是另一个我不熟悉的主题。
主要是我在问它实现迭代器会涉及到什么,以便以类似于stl迭代器的方式引用它。我也知道我可以使用boost.iterators或类似的东西来节省很多工作,但我更感兴趣的是学习所有类似的细节。
答案 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);
}