重新安排2D阵列

时间:2011-11-29 08:37:35

标签: c++ arrays pointers

我正在尝试用C ++进行一些DNA分析。 我有一个包含DNA序列的2D字符阵列。 char input[n][m];

现在基于DNA模式,我对输入数组进行了一些处理,并找到了这个模式的新序列。

假设原始序列为1,2,3,4,5,6。这些是6个DNA(2D阵列的行)

处理完毕后,我收到订单1,6,2,4,3,5。然后,如何按照此顺序重新排列原始输入数组。也就是说,第一行输入现在应该具有第一个DNA,第二行现在应该具有原始数组中第六个的DNA,依此类推。

 int main()

{

using namespace std;
char input[t][l] = {    {'A','A','A','T','C','A','G','T','A'},
                        {'A','T','T','A','C','T','G','C','A'},
                        {'A','G','C','T','A','C','T','G','C'},
                        {'A','T','T','A','C','T','G','C','A'},
                        {'A','G','C','T','A','C','T','G','C'}


                 };

// SOME PROCESSING

Here output array has the elements ={1,6,2,4,3,5}

  for (int i = 0; i<t; i++)
  {
  cout << output[i] << " ";
  }  
}

如何更改内存中的地址以重新排序原始数组?

3 个答案:

答案 0 :(得分:1)

这只会绕着指针移动:

char input[5][9] = {    {'A','A','A','T','C','A','G','T','A'},
                        {'A','T','T','A','C','T','G','C','A'},
                        {'A','G','C','T','A','C','T','G','C'},
                        {'A','T','T','A','C','T','G','C','A'},
                        {'A','G','C','T','A','C','T','G','C'}
                 };

char* output[5];
output[0] = input[3];
output[1] = input[2];
output[2] = input[4];

char test = output[1][3];

答案 1 :(得分:0)

如果您不需要这样做,只需创建新的目标矩阵,将第1行复制到第1行,将第6行复制到第2行,依此类推...... 只需使用output [i]作为原始矩阵行的索引。

随着更多的簿记,它当然也可以到位。 好的,如果你需要就地,我会做这样的事情: 你有[源行] [目标行]的对列表,如:

[1] - [1], [2]&LT; - [6], [3]&LT; - [2], ...

创建描述此复制操作的地图。然后从1开始。

[1]&lt; - [1]很容易。 (您可以从地图中删除它)

[2]&lt; - [6]会覆盖您原来的第2行,这是您在下一步中需要的。所以你交换第2行和第6行。现在第6行在正确的位置,但你需要改变映射。你需要使用像map [2] = 6之类的东西来改变映射[3]&lt; - [2]到[3]&lt; - [6]。

等等,直到完成。

答案 2 :(得分:0)

我个人会使用vector<string> input

然后

vector<double> output_list (t,0); // length t, initialized to 0

// assign the values of output_list

for (int i = 0; i<t; i++)
{
cout << input[output_list[i]] << " ";
}

请注意,此解决方案不需要额外的内存(没有第二个2D阵列),也不需要额外的计算时间(您不需要交换数据,只需调用所需的部分)

如果你绝对需要重新排序数组(正如我在你的评论中所注意到的那样),你可以根据需要swap(input[i],input[j])多次。