V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
northisland
V2EX  ›  问与答

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

  •  
  •   northisland · 2015-12-26 11:38:45 +08:00 · 4461 次点击
    这是一个创建于 3037 天前的主题,其中的信息可能已经有所发展或是发生改变。
    开源项目 DtSlam 上, FeatureMatcher 类中:

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

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


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

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

    纯粹的语法糖
    k9982874
        8
    k9982874  
       2015-12-26 11:58:05 +08:00
    c++ 11 的特性, boost 里很早就有了 foreach 实现。和 php 或 python 中的 foreach 用法一样,简化循环访问容器。
    acros
        9
    acros  
       2015-12-26 11:59:26 +08:00
    c11 里面都写滥了··· 楼主你找个近年的新开源项目看看,很多新用法的。
    Monad
        10
    Monad  
       2015-12-26 13:02:57 +08:00
    xufang
        11
    xufang  
       2015-12-26 13:10:08 +08:00
    c++ 奇技淫巧实在举不胜举。
    相比之下 c 语言就有友好很多,目前为止我就看到一个达夫设备这个 C 语言技巧是属于这类的。
    abscon
        12
    abscon  
       2015-12-26 14:50:04 +08:00 via iPhone
    @acros C++11 不可简写为 c11
    cutepig49
        13
    cutepig49  
       2015-12-26 16:48:51 +08:00
    c++没 package ,其他地方再进化也还是用得不开心……
    lsmgeb89
        14
    lsmgeb89  
       2015-12-26 18:08:06 +08:00   ❤️ 1
    C++17 是下个版本,现在 C++ 演变速度快了。
    tennix
        15
    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
        16
    wizardforcel  
       2015-12-26 20:29:01 +08:00 via Android
    以前做 lab 的时候 我还总喜欢加上 -std=c++11

    没有 range for 和 auto 的 c++ 简直是用不惯啊
    k9982874
        17
    k9982874  
       2015-12-26 20:45:07 +08:00 via iPhone
    @cutepig49 c++有 namespace 不知道你要的 package 是什么需求 namespace 提供不了的
    abcdabcd987
        18
    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
        19
    Madeline  
       2015-12-26 22:23:59 +08:00
    @abcdabcd987

    趋向于? 这不就是 (x--) > 0 吗
    Reficul
        20
    Reficul  
       2015-12-26 22:48:37 +08:00 via Android
    @Madeline
    老梗,忽悠别人用的,搭配使用的还有一个快速趋向于
    Madeline
        21
    Madeline  
       2015-12-26 22:52:04 +08:00
    @Reficul =。= 我 out 了……
    ThomasZ
        22
    ThomasZ  
       2015-12-27 00:02:11 +08:00 via iPhone
    抛弃谭浩强吧,都 16 年了, C++11 标准了都
    cutepig49
        23
    cutepig49  
       2015-12-27 16:59:00 +08:00
    @k9982874 我需要它可以像 rust 那样写好 toml 就能直接下载配置好所有依赖的 package …………
    northisland
        24
    northisland  
    OP
       2015-12-27 17:13:06 +08:00
    @cutepig49 不懂 rust 。

    但我知道没有 package 属于 C++的历史包袱。二十年前机器上装一个 20MB 的 LAPACK ,就很了不起了。所有项目工程都调这个库。
    不像现在,一个 numpy 里,自己带好几个自个儿封装的 LAPACK 库供 package 接口用。

    直接跨平台下载配置 C 工程的所有依赖关系, CMAKE 照样能胜任,可惜有真功夫能玩动这一套的程序员已经不多了。
    k9982874
        25
    k9982874  
       2015-12-27 17:41:45 +08:00 via iPhone
    @cutepig49 其实这个需求操作系统的包管理器给解决了。包管理和解决包依赖这些不是语言层面的事。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1894 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 16:17 · PVG 00:17 · LAX 09:17 · JFK 12:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.