读书人

c++中怎么将一个二维的字符数组放入栈

发布时间: 2013-07-08 14:13:00 作者: rapoo

c++中如何将一个二维的字符数组放入栈中?
问题如题,栈是STL的栈,是

stack<char**> q;
吗?我并不想往stack中放数组的指针,而是一个真实的二维数组,求例子。 C++ 栈 二维数组
[解决办法]
char *a="123456";
stack<char **>sTemp;
sTemp.push(&a);
char **b=sTemp.top();

[解决办法]
你的二维数组是固定行列数的吗?如果行列数不一致,不能直接放到一个stack中,因为它们不是同一种类型。

如果行数不一样而列数一样,只能存放char(*)[列数]。
如果列数不一样,只能存放char**,并且数组用循环为每一行分配内存。

如果行列数确定,可以定义一个结构体来代替数组:

struct charary_10_20
{
char data[10][20];
};
stack<charary_10_20> q;

之所以这样做是因为C数组是不允许赋值的,但结构可以赋值。
[解决办法]
二维数组和指针的指针是有区别的
[解决办法]
C++11的标准库中有array类模板来代替定长数组。不用C++11的话,boost库也提供了这一模板。


typedef array<array<char, 20>, 10> charary_10_20;//注意声明时列数在前行数在后,但访问时还是先行后列:ary[行号][列号]
stack<charary_10_20> q;


一点题外话:boost库以及新标准都把array中长度参数定义为第二个参数,虽然在定义一维数组时更符合我们通常的习惯,但定义多维数组时每维的长度却是倒过来的,很别扭。其实我在自己写这个模板时都是把长度定义为第一个参数:

my::array<10, int> my_int_10;//相当于int[10]
std::array<int, 10> std_int_10;//相当于int[10]

my::array<10, my::array<20, int> > my_int_10_20;//相当于int[10][20];
std::array<std::array<int, 20>, 10> my_int_10_20;//相当于int[10][20];

虽然类型在后面有些奇怪,但每维长度的定义是正序,不容易看错。类型在后的问题,可以用pascal语法去理解(只是示意,没有完全用Pascal的“下界..上界”的语法):
my::array<10, int> ==> array[10] of integer;
my::array<10, my::array<20, int> > ==> array[10][20] of integer;
[解决办法]
stack<vector<vector<char>>> q;

[解决办法]
先把指针和数组这一块基础再深入理解一下:


#include <iostream>
#include <stack>

int main(int argc, char *const argv[]) {
std::stack<char (*)[3][4]> stack;

char value[3][4] = {"1", "2", "3"};

stack.push(&value);

return 0;
}

读书人网 >C++

热点推荐