迭代还是使用计数器,这就是问题

2024-04-27

每当有人开始使用 STL 并且他们有一个向量时,您通常会看到:



vector<int> vec ;

//... code ...

for( vector<int>::iterator iter = vec.begin() ;
     iter != vec.end() ;
     ++iter )
{
  // do stuff
}

  

我只是发现整个vector<int>::iterator语法令人作呕。我知道你可以typedef vector<int>::iterator VecIterInt, 然后is稍微好一些..

但问题是,好的 ol' 有什么问题:



for( int i = 0 ; i < vec.size() ; i++ )
{
  // code
}
  

当你使用索引来执行本质上顺序的访问容器(std::vector或其他任何东西)你正在强加随机访问对底层数据结构的要求,而实际上您在算法中不需要这种访问。随机访问与明显较弱的要求相比,要求是相当强的要求顺序存取。在没有充分理由的情况下强加更严格的要求是一个重大的设计错误。

因此,您问题的正确答案是:尽可能使用顺序(迭代器)访问,仅在绝对必要时才使用随机(索引)访问。尽可能避免索引访问。

如果您的算法严重依赖于容器随机访问,成为算法的外部要求。在这种情况下,您可以毫无保留地使用索引访问。但是,如果可以仅使用迭代器来实现相同的算法,那么最好只使用迭代器,即完全依赖顺序访问。

当然,上述规则虽然正确,但只有在代码中才有意义generic在一定程度上。如果代码的其他部分是这样specific,您确信您正在使用的数据结构是std::vector并将永远是一个std::vector,那么访问方法就不再重要了。使用您喜欢的任何东西。但是,在顺序访问完全足够的情况下,我仍然会避免索引访问。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迭代还是使用计数器,这就是问题 的相关文章

随机推荐