class X {
public:
typedef std::list<int> Container;
// (1)
const Container& GetElements() const;
// (2)
Container::iterator ElementBegin();
Container::iterator ElementEnd();
// (3)
CustomIterator GetElementIterator();
private:
Container m_container;
};
我正在寻找一种一致且干净的方法来为调用者提供封装容器的迭代器。我想出了上面源代码中标记的三个想法。
- 提供 size()、begin() 和 end(),非常适合读取访问。然而,由于返回
Container
引用是const,你只能使用const_iterator
。返回非 const 引用是不好的,因为容器本身可以被修改(例如clear()
).
- 提供对元素的非常量访问,但是我们经常需要一个自己的
size()
方法(如GetElementCount()
). iterator::distance()
可以使用,但这对于某些容器来说可能效率低下(其中operator++
/--
重复调用来计算距离)。
- 提供自定义迭代器,其方法如下
next()
等仍然是自己的size()
需要方法。
我敢打赌会有更好的解决方案,所以如果您知道的话,我很高兴看到它们。
我可能会混合使用(2)和(3):
class X {
public :
typedef std::list<int> ElementContainer;
typedef ElementContainer::size_type ElementSizeType;
typedef ElementContainer::iterator ElementIterator;
typedef ElementContainer::const_iterator ConstElementIterator;
ElementIterator elementBegin() { return m_container.begin(); }
ElementIterator elementEnd() { return m_container.end(); }
ConstElementIterator elementBegin() const { return m_container.begin(); }
ConstElementIterator elementEnd() const { return m_container.end(); }
ElementSizeType elementSize() const { return m_container.size(); }
private :
ElementContainer m_container;
};
它仍然留有编写自定义迭代器的空间(通过更改typedef
s),但是只要容器提供的没问题就可以使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)