如果我有一个数组,让我说15个元素无论如何我都可以把它变成一个2x阵列,它有5x3? 或者,如果我有一个包含15个字母的字符串,是否可以将其制作成5x3的2d数组?
这就是我所拥有的(使用变量但在控制台中使用5作为a和3作为b)
void finishMap(string map, int a, int b)
{
string finalMap[a][b];
for(int i = 0; b>i; i++)
{
for(int x = 0; a>x; x++)
{
finalMap[a][b] += {{map[x]}, {i}};
}
}
}
对c ++来说也是新手,所以如果你看到任何我不应该告诉我:3
答案 0 :(得分:0)
您始终可以在 strides 中访问数组。这是一个使用模板将一维数组作为二维数组重新转换的可能示例:
template <typename T, unsigned int N1, unsigned int N2>
struct strider
{
using array_type = T[N1 * N2];
array_type & data_;
Strider(array_type & data) : data_(data) {}
T & operator()(std::size_t i1, std::size_t i2)
{
return data_[i1 * N2 + i2];
}
};
template <unsigned int N1, unsigned int N2, T>
strider<T, N1, N2> stride(T (&a)[N1, N2]) { return {a}; }
用法:
int a[15] = {};
strider<int, 3, 5> s(a);
s(1, 2) = 20;
assert(a[7] == 20);
stride<5, 3>(a)(4, 2) = 10;
assert(a[14] == 10);
我为了跨步访问而重载了operator()
,因为与operator[]
不同,它可以有arbirary签名。
通过更多的工作,您可以使跨步视图的等级变为可变。
答案 1 :(得分:0)
您可以尝试使用reinterpret_cast
。完整的例子:
#include <iostream>
using namespace std;
typedef char mtrx[5][3];
int main(){
char data[15] = "Some String";
mtrx &m = *reinterpret_cast<mtrx*>(&data);
m[1][2] = '*';
cout << data << endl;
return 0;
}
答案 2 :(得分:0)
我在我的回答中使用了char数组(c字符串),因为我认为它们对于说明数组的工作原理很有用 - 而且在你的情况下使用std :: string确实不是一个重点。 std::string
隐藏了许多基本的细节和螺栓,所以我通常建议首先使用C字符串来理解std::string
的工作原理。另外,请查看本教程:http://www.cplusplus.com/doc/tutorial/arrays/
二维数组具有与一维数组相同的存储器布局。在内存布局方面,char[3][5]
与char[3*5]
相同,与char[15]
相同。您可以使用{1}将1维数组用作2维数组。如果您使用下标,唯一的区别是编译器会记住有多少维度,并将为您完成整个char[column+row*width]
计算。
举个例子:
column+row*width
将打印:
char temp[5] = "abcd"; //need 5 for string termination char `\0`
for(int i = 0; i < 4; ++i) {
std::cout << temp[i];
}
std::cout << "\n\n";
for(int i = 0; i < 2; ++i) {
for(int j = 0; j < 2; ++j) {
std::cout << temp[j+2*i];
}
std::cout << std::endl;
}
答案 3 :(得分:0)
int main()
{
string path;
int a, b;
cin >> a >> b;
string finalMap[a][b];
for(int i = 0; b>i; i++){
cin >> path;
for(int x = 0; a>x; x++){
finalMap[x][i] = (path[x]);
}
}
for(int x = 0; b>x; x++)
{
for(int y = 0; a>y; y++)
{
cout << finalMap[y][x];
}
cout << endl;
}
return 0;
}
感谢您的尝试,非常感谢^ .-