Re: [问题] break的问题

楼主: loveme00835 (发箍)   2014-06-28 02:38:35
※ 引述《dreambegins ( ′-`)》之铭言:
for(int r=0; r<100; r++){
if(cache[index][r].v && cache[index][r].tag==tag){
cache[index][r].v=true;
cache[index][r].hit_count++;
enable_instructions[access]=2;
stillAccessing=false;
cout <<"(hit)";
break;
}
}
: 有点搞不清楚...虚心请教一下...
: 我想请问...以上的for()默认是执行100次
: 假设我在第55次的时候if()的条件成立了,然后第56~100次的for loop就不做了
: 那我的break放这里对吗?
: break是跳出if这个{}还是会跳出for的{} ?(我想要跳出整个for)
讲一个跟 break 没什么关系的点.
这篇来谈谈这个例子有没有写成 for loop 的必要.
1. 循环计数器单调递增/递减
for(int r=0; r<100; r++)
看到程式码如上, 可以很容易猜到你循环的逻辑可能只是:
"阵列某个区段内的元素都扫过一遍"
而索引又是从 0 开始跑, 更可能是在寻访所有元素.
这时应该考虑改用 range-based for 而不是一般的 for loop.
你也可以 boost::irange 来搭配 range-based for 使用.
基本上会需要循环的时候, 通常是写 while.
2. 循环里的条件结构只有单个分支
像这样有 if 没有 else 的情况, 即是:
"只对某种条件成立的元素作操作"
有筛选的味道. 可以用 boost::adaptors::filtered 搭配
range-based for 只对你感兴趣的元素跑循环.
3. 无条件 break
此循环的逻辑为:
"找到第一个符合条件的元素, 对其操作, 然后结束循环"
然后以下三行:
enable_instructions[access]=2;
stillAccessing=false;
cout <<"(hit)";
即为 "找到符合条件元素的话, 该作的标记动作", 严格算起来
可以写在循环外面. 将上述区段拉出来之后, 循环本身就剩下没
什么内容了, 这时标准函式库里有更适合你的 std::find_if()
(或是 boost::find_if()) 可将程式码改写如下:
1. const auto& interested = boost::make_iterator_range(
2. cache[index], cache[index] + 100
3. );
4.
5. const auto& found = boost::find_if(
6. interested,
7. [&](const your_cache_type& cache) {
8. return cache.v && cache.tag == tag;
9. }
10. );
11.
12. if (found != boost::end(interested))
13. {
14. found->v = true;
15. ++found->hit_count;
16.
17. enable_instructions[access] = 2;
18. stillAccessing = false;
19. cout << "(hit)";
20. }
第 1-3 行决定要寻访的阵列范围, index 只有在这里被用到,
因为它相对于接下来的逻辑只是常数, 所以没必要再次出现.
第 5-10 行用函式呼叫来替我们作搜寻的动作, 尤其第 7-9 行
用 lambda expression 封装了我们感兴趣的条件, 而不是乱
糟糟的阵列索引取值运算.
第 12-20 行专注处理如果找到让条件成立的物件时该做什么事.
结论
我个人建议尽量使用 STL Algorithms 或是 Boost Range
Algorithms 来取代 for loops, 甚至连 range-based for
都可以被取代掉.
如此一来我们可以将逻辑附加在原本的元素上, 形成另一个
抽象化的容器, 然后更专注处理问题本身, 而不是最原始的
资料.
而上面改写后第 1、5 行所产生的物件是可以在稍后被重复
使用的, 反而可以大大地减少重复程式码的出现.
作者: EdisonX (卡卡兽)   2014-06-28 12:26:00
推,好久没看版主 reply 了。
作者: soonne (石头)   2014-06-28 17:01:00
真没想到会在这看到 auto 这个关键字
作者: dreambegins (⊙_⊙)   2014-06-30 01:22:00
非常感谢您,其实当初我的潜意识就有在想我的逻辑是不是太过简单了,总希望能够有比较好的写法,您恰好说中我内心深处的愿望了,我还有很多事要向您学习!

Links booklink

Contact Us: admin [ a t ] ucptt.com