vector 制作的不定长的二维数组
实在地说,俺不是c++程序员,迫于无奈接手了c++的工作;
目前遇到一个大难题,请大家帮忙。
我需要在程序里实现一个不定长的二维数组,类似于一个横行竖列的表格,每个单元格可以存入字符串。
试验了好多方法都没有成功,后来发现网上的答案都倾向于使用 vector 来实现二维数组。
我在调试时发现二维数组的初始化和按索引存入值很成问题,请大家指点,代码如下:
CappTable.h
#include <vector>
using namespace std;
typedef vector <CString> StringArray;
typedef vector <StringArray> StringGrid;
class CappTable
{
private:
int lastRowIndex;
StringGrid dataset;
....
CappTable.cpp
#include "stdafx.h "
#include "CappTable.h "
// 初始化二维数组
CappTable::CappTable(int pageCount, Cardini &cardini)
{
this-> lastRowIndex = -1;
this-> cardini = &cardini;
int rowcount = pageCount * cardini.get_rowcount();
dataset.resize(rowcount);
for (int i=0;i <rowcount;i++)// 以下部分好像无效
{
StringArray array;
array.resize(cardini.get_colcount());
dataset[i] = array;
}
}
// 向数组中添加 // 不知道有没有放入,没有报错
void CappTable::AddPage(CDB_BLOCK_DEF block)
{
for (int r=0;r <cardini-> get_rowcount();r++)
{
lastRowIndex ++;
for (int c=0;c <cardini-> get_colcount();c++)
{
CString content = GetTextOfGrid(block, r, c);
dataset[lastRowIndex][c] = content;
}
}
}
// 将二维数组写入到文本文件中
void CappTable::WriteTextFile(CString fileName)
{
FILE *pf;
char* name = fileName.GetBuffer(fileName.GetLength());
pf = fopen(name, "w+ ");
for (int r=0;r <=lastRowIndex;r++)
{
for (int c=0;c <=cardini-> get_colcount();c++)
{
CString content = dataset[r][c];// 循环几次之后报出错误
fwrite(content, sizeof(char), strlen(content), pf);
fwrite( " ", sizeof(char), strlen( " "), pf);
}
fwrite( "\n ", sizeof(char), strlen( "\n "), pf);
}
fclose(pf);
}
// 根据行列位置取文本
CString CappTable::GetTextOfGrid(CDB_BLOCK_DEF block, int row, int col)
{
}
[解决办法]
for (int i=0;i <rowcount;i++) // 以下部分好像无效
{
StringArray array;
array.resize(cardini.get_colcount());
dataset[i] = array;
}
------------
resize只是重新申请足够大的空间,因为有可能走push几次之后,vector的初始容量不够了
如果你以当时的大小重新resize,其实是没什么效果的,只不过增加系统开销,要申请空间,还要拷贝元素到新空间
[解决办法]
dataset[lastRowIndex][c] = content;
vector的[]操作返回元素的引用,所以这个操作应该是会存入新的元素,但是要保证索引号有效,也就是这两个索引号本身要有元素存在,不然也就无所谓引用了
[解决办法]
1)
// 初始化二维数组
CappTable::CappTable(int pageCount, Cardini &cardini)
{
this-> lastRowIndex = -1;
this-> cardini = &cardini;
int rowcount = pageCount * cardini.get_rowcount();
dataset.resize(rowcount);
for (int i=0;i <rowcount;i++)// 以下部分好像无效
{
StringArray array;
array.resize(cardini.get_colcount());
dataset[i] = array;
}
}
---------------------------
你说的以下部分好像无效是什么意思呢,resize 是增大数组的有效空间
如果你可以的存取的基于数组方式,也就是 (存 : dataset[i][j] = x
取 : x = dataset[i][j] ),那么你这么写是对的了,如果是基于矢量方式
(push_back() )的话,你这样写没错,不过是多余的
不过,照你的题意,你是想建立一个2唯表格,行列对齐,那么你现在这样写就
是对的了,建议你在初始化的时候给无效数据给个初值:)
2)
// 向数组中添加 // 不知道有没有放入,没有报错
void CappTable::AddPage(CDB_BLOCK_DEF block)
{
for (int r=0;r <cardini-> get_rowcount();r++)
{
lastRowIndex ++;
for (int c=0;c <cardini-> get_colcount();c++)
{
CString content = GetTextOfGrid(block, r, c);
dataset[lastRowIndex][c] = content;
}
}
}
-------------------------------
放是一定放进去了,不过我不知道你这里的page是什么意思
一个CappTable有多个page吗?
还有你这个 block 的大小是不是跟当前表一样,不一样就有
问题了
3)
CString content = dataset[r][c];// 循环几次之后报出错误
-----------
报错的时候,你看看 r c 是否和你的表格大小一致啊? 猜是两个大小不一致的问题