BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #20045同步于 2007/7/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

[询问]C++里的set容器有办法串行化输出到文件/从文件输入?

windam
2007/7/26镜像同步10 回复
嗯。。。对stl的实现不是特别清楚。 貌似没有提供相关的接口吧。。。 只知道set/map的数据结构是红黑树,问题是,如果数据量很大的情况,每次都要从文件里一个一个节点的读出来再构建这么一棵树,再使用,不是很低效么。。。 有没有什么办法可以直接load进来就已经是一颗成型了这样的树的。。。= = 就是预先构建好树的结构用于查询,然后不用再每次都构建一遍树。把数据从硬盘读入到内存就直接是这样的结构的。。。= =(貌似好像没法直接实现) 嗯,貌似只想到了用数组的办法构建的二叉树可以直接输出到文件或者从文件直接读入。不知道有没有人比较清楚有没有什么别的办法,就是直接利用现有的set,然后实现与文件的输入输出。(数据量比较大的情况下。。。) p.s.这个问题应该算软件版的问题吧。。。挺犹豫发软件还是发算法的。。。= =
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
CNLAS机器人#1 · 2007/7/26
候捷有本讲STL源代码的书。。。去搜搜吧。。。 你的问题等别人来回答吧。。你知道我算法是渣。。。=v=b
WangZhaogang机器人#2 · 2007/7/26
从文件中读取每一项数据,然后再放入二叉数中(就是用set的insert方法),时间复杂度是Log2N,这已经是最优的了,不知道楼主还希望怎样。 当然不可能有一个文件的物理结构能和内存中的二叉树一模一样,文件无论如何都是线性的,二叉树显然不是。 如果楼主的意思是有一个函数能直接实现类似MFC的Serialize功能,那其实自己写一个<<和>>重载,一个一个读然后insert 也不麻烦
bigrat911机器人#3 · 2007/7/26
同意楼上的
redfox机器人#4 · 2007/7/26
ifstream dataFile("ints.dat"); istream_iterator<int> dataBegin(dataFile); istream_iterator<int> dataEnd; list<int> data(dataBegin, dataEnd); 这个有点帮助。
windam机器人#5 · 2007/7/26
【 在 WangZhaogang 的大作中提到: 】 : 从文件中读取每一项数据,然后再放入二叉数中(就是用set的insert方法),时间复杂度是Log2N,这已经是最优的了,不知道楼主还希望怎样。 : 当然不可能有一个文件的物理结构能和内存中的二叉树一模一样,文件无论如何都是线性的,二叉树显然不是。 : 如果楼主的意思是有一个函数能直接实现类似MFC的Serialize功能,那其实自己写一个<<和>>重载,一个一个读然后insert 也不麻烦 谢谢~ 嗯,我明白你的意思了。 如果一定要做线性的二叉树,可以用数组实现的(我记得数据结构里有),这样就可以串行化到文件以及从文件反串行化出来了。我本来希望能够达到一次读文件然后万事大吉,这样的目标,不过看来如果不自己实现数据结构,很难达到目的。 因为数据条目很多,在百万的级别。所以直观的感觉一个一个insert会降低读入效率。实际想一下其实损失也并非不可接受。log(1M)就是20,而读取本身的时间瓶颈在I/O操作上,所以logN=20的效率损失实际上可以忽略。。。。 嗯,应该是我自己的想法有误。。。尝试一下好了= = p.s.情况还是很不理想。纯读取生成这棵树,在15w个条目的情况下,几乎将近10秒钟的时间。。。感觉太慢。。。我自己再想办法好了。。。= =
Jarod机器人#6 · 2007/7/27
可以关掉 io 同步,或者,使用C库里的 fscan() 这类的io,能提高io读入速度。 【 在 windam 的大作中提到: 】 : 谢谢~ : 嗯,我明白你的意思了。 : 如果一定要做线性的二叉树,可以用数组实现的(我记得数据结构里有),这样就可以串行化到文件以及从文件反串行化出来了。我本来希望能够达到一次读文件然后万事大吉,这样的目标,不过看来如果不自己实现数据结构,很难达到目的。 : ...................
windam机器人#7 · 2007/7/27
【 在 Jarod 的大作中提到: 】 : 可以关掉 io 同步,或者,使用C库里的 fscan() 这类的io,能提高io读入速度。 scanf可以支持unicode么。。。 = = 貌似我只知道wifstream这样的可以支持。。。 回去查MSDN去了。。。= = 嗯,果然发现了wscanf这样的东西。。。试试看效率。。。 果然快了2秒钟左右啊。。。= = wifstream输入的话是9800+ms,改成wscanf的话变成了7800+ms。。。 不过感觉还是达不到要求。。。速度不够理想。。。 准备换个思路试试看哈希了。。。
WangZhaogang机器人#8 · 2007/7/27
把数据一次性读入一个大数组,(或者一次读N个,N比较大),然后再把数组里的数据一项一项插入容器。这样做肯定要比从文件读一项insert 一项要快好多。因为前者会省去频繁调用IO接口的额外开销,使用调用IO的次数尽量少。 PS:用数组实现二叉树,也就是数据结构里的“堆”。这东西和二叉树在逻辑上是一样的,你在建立的时候MS可以省时间,但在用的时候一样逃不掉LogN的复杂度。 用HASH也许可以,视你具体的数据而定,能不能有更好的Hash函数
windam机器人#9 · 2007/7/27
【 在 WangZhaogang 的大作中提到: 】 : 把数据一次性读入一个大数组,(或者一次读N个,N比较大),然后再把数组里的数据一项一项插入容器。这样做肯定要比从文件读一项insert 一项要快好多。因为前者会省去频繁调用IO接口的额外开销,使用调用IO的次数尽量少。 : PS:用数组实现二叉树,也就是数据结构里的“堆”。这东西和二叉树在逻辑上是一样的,你在建立的时候MS可以省时间,但在用的时候一样逃不掉LogN的复杂度。 : 用HASH也许可以,视你具体的数据而定,能不能有更好的Hash函数 嗯,谢谢建议。我也想到这么做。不过总有些偷懒的想法,google了半天才确定c++里没有memorystream这种东西。。。 呜。。。最讨厌自己实现底层了。。。