无意间想到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可以随着运算变化,这样就可以实现动态数组咯,哈哈 -
@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释放内存 :)