容器迭代器——它们应该嵌套吗?

container iterators - should they be nested?

客户容器的自定义迭代器应该是嵌套的 class 还是免费的(缺少更好的词)class?我已经看到了两种方式,尤其是在书籍和网上,所以不确定一种方法是否比另一种方法更有优势。我正在使用的两本书都将迭代器定义为免费 classes,其中我检查过的在线前几个实现都是嵌套的。

我个人更喜欢嵌套迭代器,如果迭代器只服务于特定容器的话。

谢谢, DDG

p.s。 - 问题不在于偏好,而在于一种方法相对于其他方法的优势。

其实是一个迭代器,它是为特定的class构建和使用的,所以不需要在外面定义它。由于您仅将其与您的容器配合使用。

如果你的迭代器被不同的 classes 使用,那就不同了,但我真的找不到它可能有用的例子。

编辑。最后,总结一下,两者都可以完成,我认为在内存使用或执行时间方面没有任何优势。为了更好地理解这一点,我们应该检查嵌套 class 和 not-nested class 之间的区别,但我认为这里是 off-topic。

虽然没有明确的答案,
我更喜欢在外面定义它们。
我不同意 ranghetto 的说法

The fact is that an iterator, it is built and used for a specific class

Different thing if your iterator it is used by different classes, but I can't really find an example of where it could be useful.

我实现了类似std::vector的容器(注意复数形式),包括double-ended一个,small-buffer优化的一个等。
他们使用相同的迭代器实现。
通常,在外部定义迭代器可以减少不必要的依赖。

the iterator only serves a particular container.

要知道的主要事情是这有多真实。


取决于您将定义的容器类型的数量和您正在应用的实现,它们中的一些很可能使用完全相同类型的迭代器。

例如,您可能会发现 myArray::iteratormyVector::iterator 具有完全相同的实现。同样,mySet::iteratormyMap::iterator 也可能相同。

如果是这样的话,最好做这样的事情来避免多次实现同一个迭代器:

// iterators.h
template<typename T>
struct contiguous_iterator
{
    // implementation for array and set iterator
};
template<typename T>
struct rb_tree_iterator
{
    // implementation for set and map iterator
};
// contiguous_containers.h
template<typename T>
struct myArray
{
    using iterator = contiguous_iterator<T>;
    //...
};
// rb_tree_containers.h
template<typename Key, typename Value>
struct myMap
{
    using iterator = rb_tree_iterator<tuple<Key, Value>>;
    //...
};