我暴露了太多的迭代器吗?

jma*_*erx 17 c++ iterator

我的班级可以有孩子,所以我需要暴露迭代器.render类需要反向迭代它们,这就是我有反向迭代器的原因.但有没有办法减少这些因为它似乎很多:

std::vector<AguiWidget*>::iterator          getChildBeginIterator();
std::vector<AguiWidget*>::reverse_iterator  getChildRBeginIterator();
std::vector<AguiWidget*>::iterator          getChildEndIterator();
std::vector<AguiWidget*>::reverse_iterator  getChildREndIterator();

std::vector<AguiWidget*>::const_iterator            getChildBeginIterator() const;
std::vector<AguiWidget*>::const_reverse_iterator    getChildRBeginIterator() const;
std::vector<AguiWidget*>::const_iterator            getChildEndIterator() const;
std::vector<AguiWidget*>::const_reverse_iterator    getChildREndIterator() const;

std::vector<AguiWidget*>::iterator          getPrivateChildBeginIterator();
std::vector<AguiWidget*>::reverse_iterator  getPrivateChildRBeginIterator();
std::vector<AguiWidget*>::iterator          getPrivateChildEndIterator();
std::vector<AguiWidget*>::reverse_iterator  getPrivateChildREndIterator();

std::vector<AguiWidget*>::const_iterator            getPrivateChildBeginIterator() const;
std::vector<AguiWidget*>::const_reverse_iterator    getPrvateChildRBeginIterator() const;
std::vector<AguiWidget*>::const_iterator            getPrivateChildEndIterator() const;
std::vector<AguiWidget*>::const_reverse_iterator    getPrivateChildREndIterator() const;
Run Code Online (Sandbox Code Playgroud)

谢谢

Naw*_*waz 13

那些对我来说很好看.或者,如果不知道你究竟在做什么,我就无法准确评论.但有一点可以肯定做到在任何速度:你为什么不使用typedef?如果您使用typedef,您也可以在课外使用它,在客户端代码中表示您将使用该类!

例如,

class sample
{
public:

  //make these typedef public so you use it from outside!
  typedef std::vector<AguiWidget*>::iterator  iterator ;
  typedef std::vector<AguiWidget*>::reverse_iterator reverse_iterator;
  typedef std::vector<AguiWidget*>::const_iterator const_iterator;
  typedef std::vector<AguiWidget*>::const_reverse_iterator const_reverse_iterator;

  iterator           child_begin();
  reverse_iterator   child_rbegin();
  iterator           child_end();
  reverse_iterator   child_rend();

  const_iterator            child_begin() const;
  const_reverse_iterator    child_rbegin() const;
  const_iterator            child_end() const;
  const_reverse_iterator    child_rend() const;
};

//Usage
sample s;
sample::iterator it= s.child_begin(); 
//see this ^^^^^^^^ how we use the typedef here!
Run Code Online (Sandbox Code Playgroud)

这看起来更好!基本上typedef封装了实现,因为它可以帮助您隐藏类的实现细节; 例如,您使用的是全班容器std::vector,std::list或者什么?再次参见上面的用法说明; 只是通过看它你不能说容器类型,可以吗?

另请注意,我也更改了函数名称.我觉得这很好.毕竟,STL使用just beginend不是beginIteratorendIterator.但是,小写是我的口味,你可能仍然喜欢大写的一致性!

在我看来,const函数没有多大意义,如果你想暴露只读迭代器,你可能想要以下一组函数!

const_iterator            readonly_child_begin();
const_reverse_iterator    readonly_child_rbegin();
const_iterator            readonly_child_end();
const_reverse_iterator    readonly_child_rend();


//Usage
sample s;
sample::const_iterator cit= s.readonly_child_begin(); 
//see this ^^^^^^^^ how we use the typedef here!
Run Code Online (Sandbox Code Playgroud)

  • 如果返回`const_iterator`的函数也不是const,那么在适当的时候你永远不能对const容器进行迭代.但是对于所有其他点+1. (2认同)
  • @Luc:我会说,即使有'私人'孩子,我仍然会为普通孩子推荐`begin`和`end`. (2认同)