某网友提问:
“
0000172009010199999999001 他们对应的结构体是id[7];date[9],date[9];item[4]
0000202009010299999999001 这是一个纯文本文件,名字叫info(d:/info)
0000222009010399999999003
0000232009010499999999002
0000242009010599999999005
0000302009010699999999001
说明:A参数是一个6位的字符串,比如说是000017;由于info文件特别大,查找A是否与info中的id匹配时,要用二分法进行查找(info中已经按id排好序了),要用c++实现下面的函数,请高手帮忙!!!!!!
int getValue( char A )
{
if(A与info文件中id匹配,并且id对应的item是“001”的话){return 1;}
if(A与info文件中id匹配,并且id对应的item是“002”的话){return 2;}
}
”
以前还碰到一个类似的问题,是在Window Mobile上的。
这个问题的解决办法有很多,用二分法自然是其中一个。但在这里,我想用STL中的map或者multimap来解决问题。
1) key单一的情况,用map
#include <iostream>
#include <fstream>
#include <map>
#include <string>
using namespace std;
// 假定info.txt的内容是:
// 0000172009010199999999001
// 0000202009010299999999001
// 0000222009010399999999003
// 0000232009010499999999002
// 0000242009010599999999005
// 0000212009010599999999005 <<< strkey为000021,目前排第6
// 0000302009010699999999001
//* 用map的方式解决
int main(void)
{
ifstream fin("info.txt");
if(!fin)
{
cout << "can not open file..." << endl;
}
// 创建map,第一个string做为key,第二个string作为value
map<string, string> linemap;
string strkey;
string strvalue;
char linestring[26];
while(fin)
{
// 读取info.txt的一行,存入linestring
fin.getline(linestring, 26);
// 将lingstring赋值给strvalue
strvalue = linestring;
// 取前位作为key
strkey = strvalue.substr(0, 6);
// 将key,value对存入map中
linemap.insert(pair<string, string>(strkey, strvalue));
}
fin.close();
// 设定要查找的字符串,将查得的结果存入stringresult中
string s = "000017";
string stringresult;
// 声明iterator
map<string, string>::iterator p;
// 检查数据被插入后,是否根据strkey排序了 -> 结论:排序了
// 即使info.txt中有重复的key,也只会有第一行含有key的文本,会被读入到map中
for(p = linemap.begin(); p != linemap.end(); ++