四处求救!!!STL的问题

mikeshi 2003-03-23 11:11:16
我其实有的疑惑,这个STL到底算是泛型技术板块还是算是标准库板块的问题,无奈,都发一份,因为用到了BCB里的TDataSet,所以在BCB也发了一份,以求到处撒网之效。
其实各位要看的话,源代码里只要求看Load,Sort和Compare函数,里面Load和Sort都是很短的,函数Compare是用来把容器内的元素还原成数据库内的类型才有这么长的switch代码的(我是用string来存放数据库里的东西的,所以比较时需要转换回去,否则都按照string来比较就不符合我的要求了。)Compare虽然很长,但是很简单的,其他的函数不必看了
不是我不想把错误贴出来,而是错误太多,有26个,都是在_algo.c和_heap.c两个STL文件里,而且错误信息都是一个样的,wanted (void),got (void),你说奇怪吗?wanted (int*),got (int)这样的错误我是见多了,什么叫wanted (void),got (void),这不是符合要求的嘛


以下是发在泛型技术板块的原贴:

有一个vector容器A,里面的元素也是vector容器B,有点儿类似二维数组,我想对容器A的数据(也就是容器B)进行排序,由于A的元素也是容器,所以要指定A的元素B的大小关系由B中哪一个来决定。
如果看不明白,可以换个思路来想,A就是一个数据库的表,B是一条一条的记录,在表A中对记录B进行排序的话,就要指定以哪一个字段作为排序的标准(用sql语句的话就是order by的是哪一个字段)。事实上,我上面一段就是一个数据库中一张表在本地机上的一个镜像。

附上我目前的源程序(只是自定义的一个类,使用BCB写的,排序算法是错误的,起码BCB的编译器给了我26个ERROR,都是STL源文件里的错误)


//MikeData.h
#ifndef MikeDataH
#define MikeDataH

#include <vector>
#include <algorithm>

typedef std::vector<AnsiString> StringVec;
typedef std::vector<int> IntVec;

class TMikeData
{

protected:
IntVec* vctType;//类型列表,记录数据库中各个字段的类型的
StringVec* vctTitle;//标题列表,记录各个字段的字段名
std::vector< StringVec* >* vctData;//数据列表,存放数据库的记录的
int iRc;//数据库内的记录数
int iFc;//记录的字段数
int index;//对记录排序时以哪一个字段为依据
void LoadTitleAndType(TDataSet* dsData);//加载字段的名字和类型
bool Compare(StringVec*,StringVec*);//比较记录大小的函数
public:
__property int RecordCount={read=iRc};
__property int FieldCount={read=iFc};
TMikeData(TDataSet* dsData);
void Load(TDataSet* dsData);//load data from database;
void Sort();
//Export函数将容器内的数据输出到ListView或StringGrid里显示。
void Export(TListView* lvList);
void Export(TStringGrid* sgGrid);

};

//---------------------------------------------------------------------------
#endif

//MikeData.cpp
//---------------------------------------------------------------------------


#pragma hdrstop

#include <vcl.h>
#include <DB.hpp>
#include <ComCtrls.hpp>
#include <Grids.hpp>
#include <idtrivialftpbase.hpp>
#include "MikeData.h"

TMikeData::TMikeData(TDataSet* dsData)
{
Load(dsData);
}

void TMikeData::Load(TDataSet* dsData)
{
iRc = dsData->RecordCount;
iFc = dsData->FieldCount;
vctType = new IntVec(iFc);
vctTitle= new StringVec(iFc);
vctData = new std::vector< StringVec* >(iRc);
dsData->First();
for(int i=0;i<iRc;i++)
{
vctData->at(i) = new StringVec(iFc);
for(int j=0;j<iFc;j++)
{
vctData->at(i)->at(j) = dsData->Fields[0][j]->AsString;
}
dsData->Next();
}
LoadTitleAndType(dsData);
}

void TMikeData::LoadTitleAndType(TDataSet* dsData)
{
TStringList* titleList = new TStringList();
dsData->GetFieldNames(titleList);
for(int i=0;i<iFc;i++)
{
vctTitle->at(i) = (*titleList)[i];
vctType->at(i) = dsData->Fields[0][i]->DataType;
}
}

void TMikeData::Export(TListView* lvList)
{
TListColumn* newColumn;
TListItem* newItem;
lvList->Clear();
lvList->Visible = false;
for(int i=0;i<iFc;i++)
{
newColumn = lvList->Columns->Add();
newColumn->Caption = vctTitle->at(i);
}
for(int i=0;i<iRc;i++)
{
newItem = lvList->Items->Add();
newItem->Caption = vctData->at(i)->at(0);
for(int j=1;j<iFc;j++)
{
newItem->SubItems->Add(vctData->at(i)->at(j));
}
}
lvList->Visible = true;
}

void TMikeData::Export(TStringGrid* sgGrid)
{
sgGrid->ColCount = iFc + 1;
sgGrid->RowCount = iRc + 1;
for(int i=0;i<iRc;i++)
{
for(int j=0;j<iFc;j++)
{
sgGrid->Cells[j+1][i+1] = vctData->at(i)->at(j);
}
}
}
//比较函数先根据vctType内的记载把将要进行比较的字段还原成原来的类型再进行比较
bool TMikeData::Compare(StringVec* A, StringVec* B)
{
bool result;
switch(vctType->at(index)){
case ftSmallint:
result = (StrToInt(A->at(index))<StrToInt(B->at(index)));
break;
case ftInteger:
result = (StrToInt(A->at(index))<StrToInt(B->at(index)));
break;
case ftWord:
result = (StrToWord(A->at(index))<StrToWord(B->at(index)));
break;
case ftBoolean:
result = (StrToBool(A->at(index))<StrToBool(B->at(index)));
break;
case ftFloat:
result = (StrToFloat(A->at(index))<StrToFloat(B->at(index)));
break;
case ftCurrency:
result = (StrToCurr(A->at(index))<StrToCurr(B->at(index)));
break;

case ftDate:
result = (StrToDate(A->at(index))<StrToDate(B->at(index)));
break;
case ftTime:
result = (StrToTime(A->at(index))<StrToTime(B->at(index)));
break;
case ftDateTime:
result = (StrToDateTime(A->at(index))<StrToDateTime(B->at(index)));
break;
case ftAutoInc:
result = (StrToInt(A->at(index))<StrToInt(B->at(index)));
break;
case ftTimeStamp:
result = (StrToDateTime(A->at(index))<StrToDateTime(B->at(index)));
break;
default:
result = (A->at(index)<B->at(index));
break;
}
return result;
}

void TMikeData::Sort()
{
//这个函数一调用,引发了_algo.c和_heap.c内26个错误
sort(vctData->begin(),vctData->end(),Compare);
}
...全文
37 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mikeshi 2003-03-23
  • 打赏
  • 举报
回复
Thank you very much.
看样子的确是这个问题,因为我调用sort函数是在我自己的类中,所以我想这个可能是可以的,但是听了你的讲解,觉得可能问题的确出在这里,我现在在家中无法测试,等会儿到了学校测试通过一定重奖,呵呵
xiaoyunet 2003-03-23
  • 打赏
  • 举报
回复
sort(vctData->begin(),vctData->end(),Compare);
从你的代码来看,这个Compare是类TMikeData的成员函数啊,这就错了,因为作为成员函数
会有一个隐含的参数this,这样sort就不能搞定了。你的这个成员函数还不能为静态的,只能是用函数对象了。
这样:
class Compare
{
public:
Compare(TMikeData* pData){_pData = pData};
bool operator()(StringVec* A, StringVec* B){将TMikeData::Compare()函数中的代码挪过来,修改一下,用_pData来代替this}
private:
TMikeData* _pData;
};

void TMikeData::Sort()
{
sort(vctData->begin(),vctData->end(),Compare(this));
}

没有经过测试,不过思路应该是正确的。你可以参考
xiaoyunet 2003-03-23
  • 打赏
  • 举报
回复
sort(vctData->begin(),vctData->end(),Compare);
从你的代码来看,这个Compare是类TMikeData的成员函数啊,这就错了,因为作为成员函数
会有一个隐含的参数this,这样sort就不能搞定了。你的这个成员函数还不能为静态的,只能是用函数对象了。
这样:
class Compare
{
public:
Compare(TMikeData* pData){_pData = pData};
bool operator()(StringVec* A, StringVec* B);
private:
TMikeData* _pData;
};

void TMikeData::Sort()
{
sort(vctData->begin(),vctData->end(),Compare(this));
}

没有经过测试,不过思路应该是正确的。你可以参考
mikeshi 2003-03-23
  • 打赏
  • 举报
回复
送分啦,我是送分童子下凡,啊哈哈哈哈哈哈哈哈哈

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧