大胆的思路,将硬盘看做内存来处理,直接在存盘文件中应用STL算法,STL高手进!
大胆的思路,将硬盘看做内存来处理,直接在存盘文件中应用STL算法,STL高手进!
问题:
往文件中连续存某一结构(struct),找出符合某条件的结构在文件中所处的位置(文件指针)。如:
struct ITEM
{
int m_a;
int m_b;
};
int main(int argc, char* argv[])
{
ITEM array[] = {{1, 2}, {1, 0}, {2, 4}, {2, 1}};
std::ofstream ofile("test.txt");
assert(ofile.is_open());
for (int i = 0; i < sizeof(array); i++)
ofile.write((const char*)&array[i], sizeof(ITEM));
// 将类型为ITEM的数组array存入文件ofile后,如何找出ITEM中m_b的值等于4的ITEM在文件
// ofile中的位置(文件指针)?一种方法是把ofile中每条类型为ITEM的记录读出来,逐一
// 比较,但觉得一方面效率低,另一方面比较傻。我想这些记录连续存于磁盘,是否可以不把
// 它一条条读出来,而是直接通过STL的find_if算法直接解决?因为如果这些记录在内存
// 中的话可以马上要find_if算法,即:
// static bool find_item(const ITEM &obj)
// {
// return obj.b == 4;
// }
// std::find_if(array, array + sizeof(array), find_item);
// 现在的区别只是这些记录在磁盘而不在内存,但和在内存一样的连续存放,我想是否
// 有办法利用流迭代器直接将stl算法find_if应用于硬盘存储的数据???哪位大虾有
// 思路????最好能给出示例代码,谢谢++
return 0;
}
问题点数:20、回复次数:8Top
1 楼bruceteen(周星星)回复于 2006-03-14 17:32:25 得分 0
我曾经把std::map算法成功移植到硬盘上,说说我的经历吧:
一开始我以为使用 win32内存影射函数,然后自定义一个内存分配器 就可以简单把map存取于硬盘,问题出在 allocator 上,我不想多说,这个 allocator 到底怎么使用根本没有明确的标准,即使我放弃移植性,那么我依然发现无论是 PJ STL(VC++用的那个),还是 SGI STL(g++用的那个),对allocator的使用都很不一致,不得不修改map代码本身。
首先我修改SGI STL,但发现一个问题,自gcc3.2之后,map中用到的一些函数竟然找不到实现代码,而我又不想退回到gcc3.2去使用。
辛苦修改PJ STL之后,发现一个新问题,为了使得算法简单,PJ STL预定义了一个static的节点,这是个大麻烦,修改起来非常辛苦。
不过最终还是成功了,我使用它来操控2G大小的磁盘空间,速度和使用内存一样快。Top
2 楼bruceteen(周星星)回复于 2006-03-14 17:33:57 得分 0
for (int i = 0; i < sizeof(array); i++)
应该是
for (int i = 0; i < sizeof(array)/sizeof(array[0]); i++)
吧?Top
3 楼bruceteen(周星星)回复于 2006-03-14 17:36:26 得分 0
你用的功能很简单:
…… find( istream_iterator<ITEM>(ifile),istream_iterator<ITEM>(), …… )Top
4 楼Wolf0403(废人:独活十年~心如刀割)回复于 2006-03-16 09:02:51 得分 0
顶一下。
这么说,STL 中 allocator 是没有一个标准接口的?Top
5 楼lookhere(~灵猴守护~)回复于 2006-03-18 13:25:17 得分 0
貌似STL只定义了器件需要满足的特性和性能下限,而没有明确实现方式Top
6 楼cunsh(村少)回复于 2006-03-18 13:41:37 得分 0
mark
xuexi;Top
7 楼yanwuhuan(燕无欢)回复于 2006-03-18 15:32:06 得分 0
印象中,侯捷介绍stl的时候,提过有个把allocator 放在硬盘中实现的,但性能巨差,基本无实用价值,只是研究的性质。楼主网上搜索看看Top
8 楼Bruceleexiaokan(笑看风云)回复于 2006-04-13 21:43:46 得分 0
Nod yanwuhuan.没有必要。Top




