Python 伪程序员读不懂 c++ 的心: C++ 中, 下面这个句子表示? new std::list< class *>[ number ] - V2EX
thedevil5032
V2EX    C

Python 伪程序员读不懂 c++ 的心: C++ 中, 下面这个句子表示? new std::list< class *>[ number ]

  •  
  •   thedevil5032 May 18, 2013 2576 views
    This topic created in 4745 days ago, the information mentioned may be changed or developed.
    提问前尝试着搜索答案无果。遂来 V2EX 求教。
    基于我的搜索和理解,通常在 C++ 中新建一个 list 是这样的: std::list<int> List;

    而后面带个[number]的用法,真是没找到。

    另外还有一句, List[number].push_back(xx)
    我只找到了 List.push_back 的用法, 这样的也是没找到。

    谢谢各位。回复必谢。
    23 replies    1970-01-01 08:00:00 +08:00
    keakon
        1
    keakon  
       May 18, 2013   1
    好像是 new 了一个数组,这个数组的长度为 number,每个元素都是 std::list< class *> 类型,这个类型是可以存储指向 class 类型的指针的列表。

    正常人应该是用 std::list<std::list<class &>>。
    magicsilence
        2
    magicsilence  
       May 18, 2013   1
    数组。
    thedevil5032
        3
    thedevil5032  
    OP
       May 18, 2013 via iPad
    不好意思,我忘记说了, number 从后面的代码看,似乎起到的是分类的作用。

    @keakon 确定是长度?
    @magicsilence 您这个答案好简洁。
    primer
        4
    primer  
       May 18, 2013   1
    @ thedevil5032
    楼主说的 List[number].push_back(), List指的是数组,数组里每个元素都是一个std::list。
    看你的意思是想定义一个list数组,看下面代码:

    std::list<int> List[N];
    List[0].push_back(11);
    List[1].push_back(12);
    primer
        5
    primer  
       May 18, 2013   1
    @thedevil5032
    上面一条回复没@ 中,再@ 一下
    detailyang
        6
    detailyang  
       May 18, 2013   1
    从右往左看,分配了长度为number的数组的,其中数组的元素为std的链表 std::list<class *>,链表中存储的为指向class类型的指针 = =.
    thedevil5032
        7
    thedevil5032  
    OP
       May 18, 2013 via iPad
    @primer 请问您代码中两条不同的 push_back 是存进了 List 这个数组不同的两个元素吗?我想确认一下。多谢。
    @detailyang 感谢您的回答,很清晰。
    primer
        8
    primer  
       May 18, 2013   1
    @thedevil5032 是的。List[index]就是索引list数组中的第index个元素,这里List数组每个元素都是一个std::list。

    List[0].push_back(11), 把11 push_back到List数组的第1个元素(list)里。
    List[1].push_back(12), 把12 push_back到List数组的第2个元素(list)里。
    Golevka
        9
    Golevka  
       May 19, 2013   1
    这显然是new出一堆list啊. 看起来像是个hash table, 其中每个lst[k]是一个bucket, lst[k].push(a)相当于将a送入hash的第k个bucket
    chchwy
        10
    chchwy  
       May 19, 2013   1
    式C++法解析

    new XXX[ 3 ]; => 以方式建 3 XXX 象
    new XXX[ number ]; => 以方式建 number XXX象
    new std::list< class *>[ number ]; => 以方式建 number std::list<class*> 象
    raychow
        11
    raychow  
       May 20, 2013   1
    std::list<class *> *pList = new std::list< class *>[ number ];
    这个 class 猜测是一个类,但这种命名真是…
    因此这句话在 new 了一个 list 数组,而 list 的内容是指向 class 类型的指针。
    shiweifu
        12
    shiweifu  
       May 20, 2013 via iPhone   1
    支持范型的数组?
    thedevil5032
        13
    thedevil5032  
    OP
       May 20, 2013
    @keakon @magicsilence @primer @Golevka @detailyang @chchwy @raychow @shiweifu

    感谢各位的答复。

    顺便提一个新的问题,代码如下:

    template<int I>
    functionX(xx)
    { return functionX<I-1>(xx);}

    template<>
    functionX(xx)<1>{ ..... }


    最后调用的时候的代码,如下(M,N为常数)
    functionX<M*N>(xx)
    47jm9ozp
        14
    47jm9ozp  
       May 20, 2013   1
    @thedevil5032

    这个是模板的递归了,会在编译期生成functionX<M*N> ,functionX<M*N-1>, ... ,functionX<1> 这些函数
    thedevil5032
        15
    thedevil5032  
    OP
       May 20, 2013
    @ooxxcc 最后调用的时候那个 <M*N> 是表明什么呢? 原函数返回值乘以 M*N?(我瞎猜的)
    primer
        16
    primer  
       May 20, 2013   1
    @thedevil5032
    楼主的问题是? 感觉是C++模版元编程,涉及到模版偏特化。

    我理解的话functionX<M*N>(xx) 执行结果等效于 functionX<1>(xx)。其实就是一个递归。
    相当于
    void fuc(int a) {
    if (a == 1) {
    ...
    }
    else {
    func(a-1);
    }
    }

    不同的是,这里是模板,一个是编译时,一个是运行时。
    sqbing
        17
    sqbing  
       May 20, 2013   1
    @thedevil5032 M和N都是常数,相乘得到的自然也是常数
    47jm9ozp
        18
    47jm9ozp  
       May 20, 2013   1
    @thedevil5032 两个都是常数,事先定义好的,然后整个式子会在编译的时候求值
    thedevil5032
        19
    thedevil5032  
    OP
       May 20, 2013
    不好意思,刚才那个回复里只贴了代码忘了提问。我的问题就是 M×N 怎么影响结果。

    我想我大概明白了。

    各位的意思是当调用 f<M*N>(xx) 的时候,整个函数就会自动产生一系列递归的函数, f<M*N>(xx),f<M*N-1>(xx)...f<1>(xx),然后将结果代入原来的函数去计算求值。

    感谢各位。


    @ooxxcc @sqbing @primer
    ====
    相当于另一个方式传递参数?
    47jm9ozp
        20
    47jm9ozp  
       May 20, 2013   1
    @thedevil5032 对的,不过这种方式只能传递常量,不可在程序运行时更改

    你给的代码里有
    template<int I>
    functionX(xx)
    { return functionX<I-1>(xx);}

    这样每个函数返回的值都是一样的,都是functionX<1> (xx)。。。。
    Golevka
        21
    Golevka  
       May 20, 2013   1
    @thedevil5032 按照你在13L给出的例子, M*N除了在编译时构造出一大堆临时函数之外什么好事都没做. 一个稍微有趣一点例子是{ return I * functionX<I-1>(xx); }, 这样当你以functionX<K>(1)的形式调用时会计算出K的factorial.
    thedevil5032
        22
    thedevil5032  
    OP
       May 21, 2013 via iPad
    @ooxxcc
    @Golevka

    sorry,原函数的 return 是 functionX<I-1>(xx) + functionY( expression(I) );

    感谢各位。祝各位晚安。
    twd2
        23
    twd2  
       May 21, 2013   1
    在 C++ 中新建一个 list 是这样的: std::list<int> List;
    在 C++ 中新建一个 list数组 是这样的:new std::list< class *>[ number ]
    About     Help     Advertise     Blog     API     FAQ     Solana     3054 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 101ms UTC 07:12 PVG 15:12 LAX 00:12 JFK 03:12
    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