Month: April 2013

On 2 dimensional array of C++

I was asked about this today. In practice, I rarely use 2-dimensional array, instead I use vector of vectors.

To allocate a 2-d array on the stack, a C-style array is

int d[2][3];

Then to refer to an element it is like

d[i][j];

To make a dynamical allocation, one can NOT write his code like this

int **wrong_d = new int[2][3];

since the d in int d[2][3]; is not a int**, instead it is of the type

int (*)[3]

or in your evil human words, it is a int[3] pointer.

It is a little tricky to declare a 2-d array dynamically.

int (*d)[3] = new int[2][3];

Or

int v1 = 2;
int (*d)[3] = new int[v1][3];

The number 3 here can NOT be replace by a non-constant. My understanding is that since this value is associated with the type of d, in a strong type language like C/C++ which should be known by the compiler.

We can check the size of variables to verify this interpretation.

 1 #include 
  2 
  3 using namespace std;
  4 
  5 int main(int argc, char **argv)
  6 {
  7     int v1 = 2;
  8     int (*d)[3] = new int[v1][3];
  9     cout << "sizeof(d): " << sizeof(d) << endl;
 10     cout << "sizeof(d[0]): " << sizeof(d[0]) << endl;
 11     cout << "sizeof(d[1]): " << sizeof(d[1]) << endl;
 12     cout << "sizeof(d[0][0]): " << sizeof(d[0][0]) << endl;
 13     return 0;
 14 }

The output is:

$./test 
sizeof(d): 8        //< 2 pointers, &d[0] and &d[1]
sizeof(d[0]): 12    //< int[3], d[0][0] d[0][1] d[0][2]
sizeof(d[1]): 12    //< int[3], d[1][0] d[1][1] d[1][2]
sizeof(d[0][0]): 4  //< an integer

To save your life, I would recommend to use vectors.

int v1 = 2;
int v2 = 3;
vector > d(v1, vector(v2, 0)); 

Nested Array in Bash

用了Bash这么久,才知道Bash支持Array。但是却缺乏对嵌套数组,或者是多维数组的支持。自己的实验里面需要用到结构性的数据,这样看起来或者改起来会比较方便,而且因为这部分是用来处理实验结果,需要经常修改,所以不适合放到C++里面去写。
因此就有了需要Bash支持嵌套数组的需求。

最终的解决方法不是很漂亮,但是也足够我自己用了。这个想法的出发点是这样的:

Bash在处理数组的时候会用到IFS这个环境变量。比如这样一段字符

Li,Age*1;Weight*2;Height*3;Friends*Sun^Wang Wang,Age*11;Weight*12;Height*13;Friends*Li^Sun

如果IFS是空格,我们就可以得到两个元素

  • Li,Age*1;Weight*2;Height*3;Friends*Sun^Wang
  • Wang,Age*11;Weight*12;Height*13;Friends*Li^Sun

如果IFS是分号(;),我们可以得到另一个数组

  • Li,Age*1
  • Weight*2
  • Height*3
  • Friends*Sun^Wang Wang,Age*11
  • Weight*12
  • Height*13
  • Friends*Li^Sun

也就是说我们可以通过指定不同的IFS让一段字符成为不同的数组。

所以,我们可以通过对每一层使用不同的IFS来表达一个嵌套数组。比如上面那段字符,我们用不同的IFS字符,先用空格( ),再用逗号(,),之后用分号(;)……
如此做下去就可以达到层层盘剥的效果(-_-!)

在实际使用中,我们只要保证每一层用到的IFS不会在数组内容中出现就行了。
为了能够生成那样一段字符,我们自然需要一些函数做辅助。

具体的代码放到Github上了。目前这个方法虽然有效,但是使用起来仍然不够简洁,看起来如果找不到更好的Bash下的解决方法,就得考虑换用一种20世纪的脚本语言了…

Github: Nested-Array-Bash

最近

已经好久没有写东西了,三言两语也是一种存在。前两天把文章投出去,这个学期也快要结束了。

真是充实的一个学期,短短不到三个月的时间里:mm过来,生活状态上带来了不小的变化,体重上来好几斤;第一篇文章被接收,总算有了Publication,感觉挺欣慰;之后是自己的PhD资格考试,严肃地讲了一次自己的工作;接着接着就是做新的文章;最后就是还没有结束的TA,第一次做助教,给小本上复习课感觉压力山大。

之后做什么呢?要做新的东西,要去学开车,暑假要去实习。很是期待暑假的实习,可以见见同学,可以看看另外一种生活状态。埋着头,慢慢走吧。忽然很想听崔健。