数据结构该怎么设置?

dianr 2004-01-05 11:44:54
现在需要读入一个文件,文件内容类似:
姓名 年龄 工作单位 住址 .........(这一行是index)
张三
李四
.
.
但是这些项目顺序、数量不固定,而且我读入这个文件以后需要用姓名做关键字分析每一项的内容,应该怎么设置数据结构呢?
每一个竖列称为Item,每一个横行称为Line,各位大虾帮帮忙~~~
我本来想每一个Item用一个vector,整体用map<string,vector>,可是好像又不知道具体怎么实现~~烦阿~~
...全文
48 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdwtao 2004-01-05
  • 打赏
  • 举报
回复
可以用结构链表
bluebohe 2004-01-05
  • 打赏
  • 举报
回复
就是二维表,所以用两个list或者basic_string组织足够!
如果名字是唯一的话,可以使用list+map
具体实现方式,你是不知道什么呢?
dianr 2004-01-05
  • 打赏
  • 举报
回复
规定好了使用方法的~~
现在这个文件就是一个普通的file.
我现在的目标就是把文件里的字符都读出来,麻烦也没有办法喽,必须一一校验……
现在的问题就是怎么样设置数据结构???
wangweintk 2004-01-05
  • 打赏
  • 举报
回复
建议用数据库
byry 2004-01-05
  • 打赏
  • 举报
回复
1 不如改为数据库
2 用姓名做关键字不合适,因为姓名有可能重复

如果用vector<CString>这样做也可以,你可以把每一条记录当作一个Line,放在vector<CString>里,每次从vector<CString>里面得到一条记录,然后对该记录再逐个分析每一项,这样做会遇到大量的字符操作,太不方便了
shenyc 2004-01-05
  • 打赏
  • 举报
回复
首先确定文件格式,因为他是处理对象,如果没有固定格式,所有的大师都没有办法
hz张三 2004-01-05
  • 打赏
  • 举报
回复
看着msdn,现学了点STL,按楼主的要求,高手们不要笑我哦:


#pragma warning(disable:4786)

#include <string>
#include <vector>
using namespace std;

typedef vector<string> STRINGARRAY;
typedef struct OBJ_HR
{
STRINGARRAY listIndex;
vector< STRINGARRAY > listData;
} obj_hr;

int main()
{
obj_hr hr;

hr.listIndex.insert( hr.listIndex.end(), "name" );
hr.listIndex.insert( hr.listIndex.end(), "age" );
hr.listIndex.insert( hr.listIndex.end(), "unit" );
hr.listIndex.insert( hr.listIndex.end(), "Addr" );

//while( “读文件......” )
{
STRINGARRAY asItem;
asItem.insert( asItem.end(), "张三" );
asItem.insert( asItem.end(), "25" );
asItem.insert( asItem.end(), "zsoft" );
asItem.insert( asItem.end(), "hz" );
hr.listData.insert( hr.listData.end(), asItem );
}
return 0;
}
PingJie 2004-01-05
  • 打赏
  • 举报
回复
用多维数组就能解决
不过这怎么讲都是很麻烦的(用文件)
我建议用数据库 用数据库操作起来是很简单的
hz张三 2004-01-05
  • 打赏
  • 举报
回复
写错了,如果你把它们现在在CListCtrl中也方便,
如果你把它们显示在CListCtrl中也方便,
hz张三 2004-01-05
  • 打赏
  • 举报
回复
可是现在是要把index的内容读入,但我并不知道哪个是姓名,哪个是年龄,有可能没有年龄这一列呃……
----------------------------------------------------------------------
哦,这样吧!
CStringArray m_asIndex;
CObList m_listHr; // obj类型为CPerson
......
class CPerson : CObject
{
public:
CStringArray m_asData;
......
}
先把index的内容读入m_asIndex,再读入m_listHr反正一一对应。
如果你把它们现在在CListCtrl中也方便,
m_asIndex设置header,m_listHr设置各行的数据。

这样笨点,但很简单易懂。
实际工作中我一般都是这么做的。
bluebohe 2004-01-05
  • 打赏
  • 举报
回复
你可以把map的除了姓名以外的其他元素做成一个结构体或列表,姓名单挑出来作为索引,使用结构体获列表的指针作为map的元素
dianr 2004-01-05
  • 打赏
  • 举报
回复
如果我使用map,读了第一行index,把那些索引的名字都插入到了map中,作为键值,也就是说,现在map是这个样子了:<"键值1","">,<"键值2","">,当然,我并不知道具体这些键值1,2到底是哪一个。下面我要把那些内容相应的插进去应该怎么做呢?读文件是一行一行读入的,所以插的时候只能一行一行而不是一列一列的插。(假设map的第二个值是一个list)。怎么办呢?
dianr 2004-01-05
  • 打赏
  • 举报
回复
可是现在是要把index的内容读入,但我并不知道哪个是姓名,哪个是年龄,有可能没有年龄这一列呃……
hz张三 2004-01-05
  • 打赏
  • 举报
回复
STL设计的本身似乎在对抗oop,
你的程序算法速度效率优先的话,选择STL
易维护好理解优先的话,就不要刻意使用STL
hz张三 2004-01-05
  • 打赏
  • 举报
回复
这样吧,也好理解
class CPerson : CObject
{
public:
CString m_strName;
UINT m_nAge;
CString m_strUnit;
CString m_strAddr;

......
}


CObList listHr;
bluebohe 2004-01-05
  • 打赏
  • 举报
回复
stl map的用法比较复杂,看下面的例子
#include "stdafx.h"
#pragma warning(disable:4786)
#pragma warning(disable:4251)
#pragma warning(disable:4273)

#include <map>
using namespace std;
struct ltstr
{
bool operator()(const char* s1, const char* s2) const
{
return strcmp(s1, s2) < 0;
}
};

int main(int argc, char* argv[])
{

map<const char*, int, ltstr> months;
months["january"] = 31;
months["february"] = 28;
months["march"] = 31;
months["april"] = 30;
months["may"] = 31;
months["june"] = 30;
months["july"] = 31;
months["august"] = 31;
months["september"] = 30;
months["october"] = 31;
months["november"] = 30;
months["december"] = 31;
map<const char*, int, ltstr>::size_type st = months.size();
int i=months["january"];
i=months["february"];
months.clear();
return 0;
}
bluebohe 2004-01-05
  • 打赏
  • 举报
回复
建议你用CMapStringToPtr比较方便,比如下面这个小例子
CMapStringToPtr StrMap;
int *p=new int;
*p=10;
StrMap.SetAt("bluebohe",p);
p=new int;
*p=11;
StrMap.SetAt("vcforever",p);
p=NULL;
POSITION pos=StrMap.GetStartPosition();
while(pos)
{
CString str;
StrMap.GetNextAssoc(pos,str,(void *&)p);
if(p!=NULL)
{
delete p;
p=NULL;
}
}
StrMap.RemoveAll();
nkwesley 2004-01-05
  • 打赏
  • 举报
回复
数据库or结构链表
dianr 2004-01-05
  • 打赏
  • 举报
回复
bluebohe:非常感谢!名字是唯一的!
读取这个文件,然后将它插入到map中:先插index,让index那一行作为map的键值对吧?也就是说用先读index行,然后用mymap.insert(pair<string,list>)插入,这时候list是空。然后再读一行,这一行是具体的内容,插入到相应的map的键值的list当中,那么应该怎么插入阿?谢谢!!
原谅我的菜鸟……-_-!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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