CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  工具平台和程序库

大胆的思路,将硬盘看做内存来处理,直接在存盘文件中应用STL算法,STL高手进!

楼主aclaire(酱爆)2006-03-14 17:19:13 在 C/C++ / 工具平台和程序库 提问

大胆的思路,将硬盘看做内存来处理,直接在存盘文件中应用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

相关问题

  • stl中的哈希算法?
  • STL算法find问题
  • 欢迎讨论STL中的算法!
  • 请解决STL中copy()算法这样运用的问题?
  • delphi中有无类似stl的标准算法库?
  • STL中的算法有数学上的内插法吗?
  • Delphi有stl标准算法库吗?请各位指教
  • %%%%%%%%%%%% stl 算法 for_each() 调用类成员函数失败,请执教
  • Delphi 如何实现类似于 C++ STL 的容器的算法?
  • 在UNIX中可以包含STL算法吗?

关键词

  • stl
  • 文件
  • 硬盘

得分解答快速导航

  • 帖主:aclaire

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo