容器迭代器——它们应该嵌套吗?
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::iterator
和 myVector::iterator
具有完全相同的实现。同样,mySet::iterator
和 myMap::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>>;
//...
};
客户容器的自定义迭代器应该是嵌套的 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::iterator
和 myVector::iterator
具有完全相同的实现。同样,mySet::iterator
和 myMap::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>>;
//...
};