第一次见到 c++的 for 循环的如此妖法!!另外请问这是什么版本的什么特性? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
northisland
V2EX    问与答

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

  •  
  •   northisland 2015-12-26 11:38:45 +08:00 5185 次点击
    这是一个创建于 3608 天前的主题,其中的信息可能已经有所发展或是发生改变。
    开源项目 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 ia 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     Solana     950 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.85 25ms UTC 20:40 PVG 04:40 LAX 12:40 JFK 15:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86