首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-03-06 
vector 制作的不定长的二维数组实在地说,俺不是c++程序员,迫于无奈接手了c++的工作;目前遇到一个大难题,请

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


热点排行