我正在尝试用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] << " ";
}
}
如何更改内存中的地址以重新排序原始数组?
答案 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])
多次。