无意间想到List的一个好用法



  • 以前在OpenFOAM中有个问题一直困扰我,如何建立二维动态数组。经过一段时间的C++学习,发现可以用new来开辟空间,不过比较麻烦的是,用完new后需要delete来释放内存。如果能有个简便的方法岂不是很好?
    今天下午忽然灵光一闪List<type>不就相当于一维动态数组么。那么List<List<type>>会怎么样呢?

    int N=1
    pisoloop:
    {
             N++;     
             List<List<label>>  eulerIndex(N,List<label>(16,label(-1)));
             Info << eulerIndex <<endl;
    }
    

    竟然成功了!
    N可以随着运算变化,这样就可以实现动态数组咯,哈哈:yes:


  • Linux讲师

    @Samuel-Tu 数组的效率、类型检查都是最好的。占用空间也小。其他类似的类型list或者arrylist的扩展性来自于他们像封装的链表,就是结构体变量内放存贮变量和上下链的两个指针。占用空间大,索引效率也低,当然这是在计算量非常大的前提下。



  • @bestucan 这样啊,但是我不知道用new开辟空间,如果用并行计算的话会不会有影响。并行计算的new和delete是每个单独的核单独申请内存空间,还是所有核共用这个空间呢?



  • 我验证了下如果是并行,new 和 delete是每个核单独开辟或者清除内存空间,相关代码如下:

        int (*eulerIndex)[2];
        eulerIndex=new int[4][2];
        for(int i=0;i<4;i++)
        {
            for(int j=0;j<2;j++)
            {
                *(eulerIndex[i]+j)=-1;
                if(i==Pstream::myProcNo())
                {
                    *(eulerIndex[i]+j)=Pstream::myProcNo();
                }
            }
        }
        if (Pstream::myProcNo()==2)
        {
            for(int i=0;i<4;i++)
            {
                for(int j=0;j<2;j++)
                {
                    Pout<< *(eulerIndex[i]+j) <<endl;
                }
            }
            delete[] eulerIndex;
        }
        if (Pstream::myProcNo()==3)
        {
            for(int i=0;i<4;i++)
            {
                for(int j=0;j<2;j++)
                {
                    Pout<< *(eulerIndex[i]+j) <<endl;
                }
            }
        }
        if (!Pstream::myProcNo()==2)
        {
            delete[] eulerIndex;
        }
    

    结果输出:

    [2] -1
    [2] -1
    [2] -1
    [2] -1
    [2] 2
    [2] 2
    [2] -1
    [2] -1
    [3] -1
    [3] -1
    [3] -1
    [3] -1
    [3] -1
    [3] -1
    [3] 3
    [3] 3
    
    


  • c++11的实现就是vector套vector,俄罗斯套娃



  • @Samuel-Tu 可以new一个空间,不会影响并行。但是不建议用链表或者二维数组,很影响效率和内存。有时候,索引链表花的时间甚至比解输运方程还多!我觉得最好不要用List。无论是链表还是多维数组,都是编译器帮你完成的寻址工作,最后从占用内存上讲都是一个一维数组。栈上还稍好,存储在堆上就疯了。自己计算元素的index,全部储存在一个一维数组中是最高效的方案



  • @白礼耕 好的,不过我得使用动态一维数组,看来应该需要new一位数组了



  • @Samuel-Tu 是的,new一维数组,通过指针对数组操作,不需要的时候还要delete释放内存 :)


Log in to reply