每当有人开始使用STL并获得 vector 时,通常会看到:
vector vec;
//... 代码 ...
for(vector ::iterator iter = vec.begin();
iter!= vec.end();
++ iter)
{
//做东西
}
我只是发现整个vector<int>::iterator
语法令人生厌。我知道您可以typedef vector<int>::iterator VecIterInt
,那就更好了..
但问题是,好的ol'有什么问题:
for(int i = 0; i {
//代码
}
最佳答案
当您使用索引对容器(std::vector
或其他任何东西)执行本质上的顺序访问时,您会将随机访问要求强加于基础数据结构,而实际上您在算法中不需要这种访问。与顺序访问的需求相比,随机访问的需求非常弱。在没有充分理由的情况下强加更严格的要求是一个主要的设计错误。
因此,您问题的正确答案是:尽可能使用顺序(迭代器)访问,仅在绝对必要时才使用随机(索引)访问。尽可能避免访问索引。
如果您的算法严格依赖于可随机访问的容器,那么它将成为算法的外部要求。在这种情况下,您可以毫无保留地使用索引访问。但是,如果有可能仅使用迭代器来实现相同的算法,则优良作法是仅坚持使用迭代器,即仅依赖于顺序访问。
当然,以上规则虽然正确,但仅在一定程度上对代码通用才有意义。如果代码的其他部分如此具体,以至于您确定要使用的数据结构是std::vector
,并且始终是std::vector
,则访问方法不再重要。使用您喜欢的任何东西。但是,在顺序访问就足够了的情况下,我仍然会避免索引访问。
关于c++ - 要迭代或使用计数器,这就是问题所在,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1856307/