第一次见到 c++的 for 循环的如此妖法!!另外请问这是什么版本的什么特性?

2015-12-26 11:38:45 +08:00
 northisland
开源项目 DtSlam 上, FeatureMatcher 类中:

for( auto &kp: frame->getKeyPoints( octave ) ) {
...
}

其中 frame->getKeyPoints()返回值为 Vector<KeyPointData> &


感觉 c++离谭浩强越来越远啦~~

另外请问这是什么用法?
4736 次点击
所在节点    问与答
25 条回复
ncisoft
2015-12-26 11:44:44 +08:00
这有什么特异之处?
choury
2015-12-26 11:46:30 +08:00
这是 c++11 的特性,现在都快 2016 年啦
andong777
2015-12-26 11:50:05 +08:00
我还以为发现了什么激动人心的特性……
htfy96
2015-12-26 11:51:11 +08:00
C++11 特性,还有人提过提案可以这么写:
for (kp : vec)
cout << kp << endl;
不过被否了
northisland
2015-12-26 11:52:14 +08:00
@ncisoft 我的意思是,帖子里的 c++ for 循环,很像 python 中 for 循环调用迭代器或者生成器的用法。
我印象中 c++里 for 循环只有这个语法 for( ; ; )
ncisoft
2015-12-26 11:55:03 +08:00
@northisland 楼上不是有人说了 c++11 特性了么
htfy96
2015-12-26 11:57:04 +08:00
@northisland 等价于
for(auto it=vec.begin(); it!=vec.end(); ++it)
{
auto& kp = *it;
//...
}

纯粹的语法糖
k9982874
2015-12-26 11:58:05 +08:00
c++ 11 的特性, boost 里很早就有了 foreach 实现。和 php 或 python 中的 foreach 用法一样,简化循环访问容器。
acros
2015-12-26 11:59:26 +08:00
c11 里面都写滥了··· 楼主你找个近年的新开源项目看看,很多新用法的。
Monad
2015-12-26 13:02:57 +08:00
xufang
2015-12-26 13:10:08 +08:00
c++ 奇技淫巧实在举不胜举。
相比之下 c 语言就有友好很多,目前为止我就看到一个达夫设备这个 C 语言技巧是属于这类的。
abscon
2015-12-26 14:50:04 +08:00
@acros C++11 不可简写为 c11
cutepig49
2015-12-26 16:48:51 +08:00
c++没 package ,其他地方再进化也还是用得不开心……
lsmgeb89
2015-12-26 18:08:06 +08:00
C++17 是下个版本,现在 C++ 演变速度快了。
tennix
2015-12-26 18:37:00 +08:00
从这篇博客 http://gladdy.github.io/c++/2015/07/26/NodeDemystified-pt1.html 里摘一段 C++ 与 NodeJS 的对比,不知现在 V 站评论对 markdown code block 支持怎么样了,显示不好大家支看原文吧。初看一眼,卧槽, C++ 都快进化到跟人人都会写的 JS 长得一样了

```c++
TCPServer server ([&](Socket &socket) {

console.log("Client connected");
console.log("address: " + socket.remoteAddress());
console.log("port: " + socket.remotePort());

socket.on("data", [&, socket](Data data) mutable {
//Handle the received data
});
socket.on("end", [&, socket](){
//Handle the client disconnect
});
});
server.listen(1338);
```

```javascript
var server = net.createServer(function(socket){

console.log("Client connected");
console.log("address: " + socket.remoteAddress);
console.log("port: " + socket.remotePort);

socket.on("data", function(data){
//Handle client message
});
socket.on("end", function(){
//Handle client abort
});
});
server.listen(1338)
```
wizardforcel
2015-12-26 20:29:01 +08:00
以前做 lab 的时候 我还总喜欢加上 -std=c++11

没有 range for 和 auto 的 c++ 简直是用不惯啊
k9982874
2015-12-26 20:45:07 +08:00
@cutepig49 c++有 namespace 不知道你要的 package 是什么需求 namespace 提供不了的
abcdabcd987
2015-12-26 20:57:39 +08:00
(歪楼向
C++ 的奇技淫巧真的很多的,不知道楼主知不知道有个“趋向于”操作符

int x = 10;
while (x --> 0) {
printf("%d ", x);
}

这样会输出 9 8 7 6 5 4 3 2 1 0 就可以用 while 实现 for 的效果!
Madeline
2015-12-26 22:23:59 +08:00
@abcdabcd987

趋向于? 这不就是 (x--) > 0 吗
Reficul
2015-12-26 22:48:37 +08:00
@Madeline
老梗,忽悠别人用的,搭配使用的还有一个快速趋向于

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/246256

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX