授予对封装容器的访问权限

sts*_*ler 5 c++ iterator stl

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;
};
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种一致且干净的方法来为封装容器提供迭代器给调用者.我想出了上面源代码中标记的三个想法.

  1. 提供size(),begin()和end(),这些都非常适合读取访问.但是,因为返回的Container引用是const,所以您只能使用const_iterator.返回引用非const是不好的,因为容器本身可以被修改(例如clear()).
  2. 提供对元素的非const访问,但是我们经常需要一个自己的size()方法(比如GetElementCount()).iterator::distance()可以使用,但对于某些容器(其中operator++/ --被重复调用以计算距离)可能效率低下.
  3. 使用类似的方法提供自定义迭代器next().仍然需要自己的size()方法.

我强烈打赌有更好的解决方案,所以如果你知道的话,我会很高兴见到它们.

San*_*ker 2

我可能会混合使用(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;
};
Run Code Online (Sandbox Code Playgroud)

它仍然留有编写自定义迭代器的空间(通过更改 s typedef),但只要容器提供的迭代器没问题,就可以使用它们。