读书人

vector 制作的不定长的二维数组,该如何

发布时间: 2012-03-06 20:47:55 作者: rapoo

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 是否和你的表格大小一致啊? 猜是两个大小不一致的问题


读书人网 >C++

热点推荐