Skip to content
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
CFD中文网

CFD中文网

  1. CFD中文网
  2. OpenFOAM
  3. 无意间想到List的一个好用法

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

已定时 已固定 已锁定 已移动 OpenFOAM
8 帖子 4 发布者 5.9k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • S 离线
    S 离线
    Samuel-Tu
    写于 最后由 编辑
    #1

    以前在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:

    bestucanB 1 条回复 最后回复
  • bestucanB 离线
    bestucanB 离线
    bestucan 版主 大神
    在 中回复了 Samuel-Tu 最后由 编辑
    #2

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

    滚来滚去……~(~o ̄▽ ̄)~o 滚来滚去都不能让大家看出来我不是老师么 O_o

    异步沟通方式(《posting style》from wiki)(下载后打开):
    https://www.jianguoyun.com/p/Dc52X2sQsLv2BRiqnKYD
    提问的智慧(github在gitee的镜像):
    https://gitee.com/bestucan/How-To-Ask-Questions-The-Smart-Way

    S 1 条回复 最后回复
  • S 离线
    S 离线
    Samuel-Tu
    在 中回复了 bestucan 最后由 编辑
    #3

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

    白 1 条回复 最后回复
  • S 离线
    S 离线
    Samuel-Tu
    写于 最后由 编辑
    #4

    我验证了下如果是并行,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
    
    
    1 条回复 最后回复
  • Z 离线
    Z 离线
    Zephyr
    写于 最后由 编辑
    #5

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

    1 条回复 最后回复
  • 白 离线
    白 离线
    白礼耕
    在 中回复了 Samuel-Tu 最后由 编辑
    #6

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

    S 1 条回复 最后回复
  • S 离线
    S 离线
    Samuel-Tu
    在 中回复了 白礼耕 最后由 编辑
    #7

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

    白 1 条回复 最后回复
  • 白 离线
    白 离线
    白礼耕
    在 中回复了 Samuel-Tu 最后由 编辑
    #8

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

    1 条回复 最后回复

  • 登录

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]