首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++ Primer中为何用!=来判断for循环是否结束呢?小弟我觉得这样做不安全啊

2014-01-17 
C++ Primer中为何用!来判断for循环是否结束呢?我觉得这样做不安全啊!比如说这样的语句:for (auto iter

C++ Primer中为何用!=来判断for循环是否结束呢?我觉得这样做不安全啊!
比如说这样的语句:



for (auto iter = Container.begin(); iter != Container.end(); ++ iter)
{
   ...
}

这就是所谓的通用性,但世上没有万能药,你需求不一样何必强求,还指责别人不够通用~
[解决办法]
引用:
比如说这样的语句:

for (size_t ix = 0; ix != array_size; ++ix)
ib[ix] = ix;

要是++ix改成ix+=2,并且array_size是奇数的话,那么不就出问题了吗?
书上说之所以用!=,是为了generic algorithm考虑。那么这是否说明这是一对不可调和的矛盾?


需要处理这种情况,自然有办法解决

之所以这样做,是为了数组,链表,向量等迭代器的相关的算法,可以通用。

对于你提到的,这种需要特别处理的地方,要么特别处理迭代器,要么特别处理算法。

其实,用STL输出容器,如果要求,不要有多余的分隔符,
不也是不能一次到位么?要不然,就需要添加多余的判断。
但是,STL 问世以来,好象没有人,抱怨这个问题。

甚至C,C++循环也做不到,简单的不用判断,就解决在这个问题;
也没有人抱怨C,C++的循环不好,输出语句不好。

任何和一个解决方案,都不是十全十美的。
个人感觉让容器,更有通用性,还是个比较好的解决方案,
感觉这种取舍是可取的。

因为STL更倾向于,让算法具有通用性。






[解决办法]
引用:
比如说这样的语句:

for (size_t ix = 0; ix != array_size; ++ix)
ib[ix] = ix;

要是++ix改成ix+=2,并且array_size是奇数的话,那么不就出问题了吗?
书上说之所以用!=,是为了generic algorithm考虑。那么这是否说明这是一对不可调和的矛盾?



楼主的问题,考虑太多了,现实问题是各不相同的,设计者只是设计了一个通用的格式,在应用的过程中还需要我们区根据自己的需要去改变。就像楼主提到的  要是把ix+=2,我们也可应用他的设计来完成。
如:for(size_t ix = 0; ix < array_size; ix+=2)
{

}
ix < array_size  这只是循环的检查条件而已,这个根据你的需求而定,是活的,不要太去纠结这些没意义的东西。
[解决办法]
用 <= 得不同元素之间有先后关系 顺序关系
而stl里面有一些容器中不同元素之间并不存在这样的关系 
<=比较的基础都没有 无计可施
[解决办法]
书上不是说了吗, C++程序员多使用迭代器来遍历,
所以习惯了写
for(auto it = sv.begin(); it != sv.end(); ++it)
{

}

这种风格的代码,我觉得用!=会是代码看起来更精确
[解决办法]
引用:
总有一个原则问题吧。我觉得是不是可以这样:能用<或者<=判断就用<或<=,否则再考虑!=?


原则, 别个也已经说得很清楚了, 为了通用性.

因为stl遍历都使用了迭代器, 这个iterator又不支持大小比较. 因为你不知道容器中保存的是什么样的数据, 可能是一个基本数据类型, 可能是一个类或者结构体, 或者是一个指针.
[解决办法]
小弟,不要在意这些细节。用!=来判断结束我不怎么喜欢,当i不是每次+1的时候,很容易出现死循环
[解决办法]
作者的前提是++ix,自然可以用!=,ix+=2的话,作者就不会这么说了
[解决办法]
引用:
作者的前提是++ix,自然可以用!=,ix+=2的话,作者就不会这么说了


对于链表其实也是合适的,只要 ++,+= 定义的合理
对于vector 看Iterator 如何定义如果直接定义成指针;
那就没有办法了,如果定义成一个类型,那还是有办法的。

热点排行