- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
vector<int> a;
1.
for(vector<int>::iterator it = a.begin(); it != a.end(); ++it)
2.
vector<int>::iterator end = a.end();
for(vector<int>::iterator it = a.begin(); it != end; ++it)
哪个效率更高?还是一样?
最佳答案
初步批评:
1/典型教程示例
for(vector<int>::iterator it = a.begin(); it != a.end(); ++it)
没有魔法,但它提出了一个问题:a
是否曾在循环中修改过,结束边界可能会发生变化?
2/改进
vector<int>::iterator end = a.end();
for(vector<int>::iterator it = a.begin(); it != end; ++it)
a.end()
似乎只执行一次。然而,由于 end
不是 const
,它可能在循环内被修改。
此外,它在外部作用域中引入了 end
标识符,污染了它。
因此,在性能上有潜在的提升,但在清晰度上没有太大提升。而且,它更加冗长。
我会提出其他几种方式:
3/最佳手册
for(vector<int>::iterator it = a.begin(), end = a.end(); it != end; ++it)
结合了v1
(非常简洁,无外部作用域污染)和v2
(性能)的优点,但是还不清楚结束
在循环体内被修改过。
4/助力
BOOST_FOREACH(int& i, a)
比 v1
更简洁,一目了然,无外层作用域泄漏,保证完全迭代(无法修改边界)。
不幸的是:
注意:理论上,可以在这里使用 std::foreach
算法,但老实说......在外部定义谓词需要付出太多努力,而且它破坏代码局部性。
5/C++11 range-for 语句
for (int& i: a)
所有优点:
而且没有任何问题(范围泄漏、预处理器魔法)。
就我个人而言,我尽可能使用 C++11 range-for(业余项目),否则使用 BOOST_FOREACH
(在工作中)。
我避免像瘟疫一样修改我正在迭代的容器,当我需要过滤/删除元素时更喜欢依赖 STL 算法......否则很容易搞乱边界条件和迭代器失效。
关于c++ - C++中的两种形式有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10346287/
我觉得 for(int i = 0; i < 2; i++) 和 for(int i = 0; i < 2; ++i) 不应该做同样的事情。对于第二个例子,从循环开始 i 应该等于 1 对我来说更符合
我试图牢牢掌握异常情况,以便改进我的conditional loop implementation .为此,我进行了各种实验,扔东西,看看会被抓到什么。 这个让我惊喜不已: % cat X.hs mo
我只是想回答一个问题,但我遇到了一些我不明白的事情!为什么如果我在文件中使用内联 CSS 或 CSS,如本例中的颜色,结果就不一样! 代码相同,但第一段是绿色,第二段是红色! 我真的不明白为什么? 谢
我目前正在学习 CSS 并进行试验,我偶然发现了输出中的这种差异。所以这是代码: .red-text { color: red;
"""module a.py""" test = "I am test" _test = "I am _test" __test = "I am __test" ============= ~ $ p
在向 Firestore 写入文档时,我经常看到 serverTimestamp() 标记和 new Date() 对象之间的差异不为零。 差异范围从几 秒到几十 分钟。 他们不是在做同样的事情吗?
据我了解,2.675 和 numpy.float64(2.675) 都是相同的数字。然而,round(2.675, 2) 给出 2.67,而 round(np.float64(2.675), 2) 给
问题本身的描述很简单。我正在测试 C++11 中 std::thread 库和 boost::thread 库的区别。 这些的输出: #include #include #include int
我只是想将文本文件读入 pyspark RDD,我注意到 sqlContext.read.load 之间的巨大差异和 sqlContext.read.text . s3_single_file_inp
SC.exe 和 InstallUtil 都可以安装/卸载 Windows 服务。但它们的工作方式似乎并不相同。 有什么区别? 例如,InstallUtil 失败(找不到某些文件或依赖项错误),而 S
我认为Thread对象就像是带有名称和静态Thread.CurrentThread()的抽象对象,就像访问Thread对象的方式一样。显然,这是错误的假设。。是这样的吗?
我认为Thread对象就像是带有名称和静态Thread.CurrentThread()的抽象对象,就像访问Thread对象的方式一样。显然,这是错误的假设。。是这样的吗?
我是一名优秀的程序员,十分优秀!