码迷,mamicode.com
首页 > 编程语言 > 详细

C++学习之字符串查询

时间:2014-09-22 02:14:21      阅读:329      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   ar   for   div   sp   

本博文主要探讨字符串的相关操作。

问题描述:将一篇文本录入,实现查询功能。

a):可以输入字符或者字符串,然后将包含他们的单词取出,并打印;(即返回一个容器)

b):允许重复;

c):如果查询词包含多项,则执行多次查询。例如:“hello world”,则先查询hello,后查询world。

本程序待优化之处:

1):每次查询都要从头到尾遍历一次容器。

探讨如下:

1):是否可以再readfile之后对容器进行排序;(因为程序只要求实现查询功能)。

2):然后用二分查找进行查询。

 

代码如下(不包括待优化项):

  1 #include <iostream>
  2 #include <string>
  3 #include <vector>
  4 #include <fstream>
  5 #include <stdio.h>
  6 #include <stdlib.h>
  7 #include <string.h>
  8 #include <sstream>
  9 #include <stdexcept>
 10 #define ERR_EXIT(m)  11     do {  12         perror(m); 13         exit(EXIT_FAILURE); 14     }while(0)
 15 using namespace std;
 16 
 17 void readfile( ifstream &in, vector<string> &vec);
 18 void toloweranderasepunct(string &str);
 19 vector<string> querystr( vector<string> &vec );
 20 
 21 int main(int argc, const char *argv[])
 22 {
 23     if(argc < 2)
 24     {
 25         perror("Usage: exe, filename");
 26         exit(EXIT_FAILURE);
 27     }
 28        
 29     vector<string> vec ;
 30     vector<string> dup ;
 31     ifstream in(argv[1]);
 32     if( !in )
 33         throw runtime_error("open file failure");
 34     
 35     readfile( in, vec );
 36     
 37 
 38     dup =  querystr( vec );
 39     cout << "from duplicate vector:" << endl ;
 40     
 41     for(vector<string>::iterator it = vec.begin(); 
 42         it != vec.end(); 
 43         ++it)
 44     {
 45         cout << *it << endl;    
 46     }
 47     
 48     in.close();
 49     return 0;
 50 }
 51 
 52 void readfile( ifstream &in, vector<string> &vec)
 53 {
 54     vec.clear();
 55     string s ;
 56     while(in >> s)
 57     {
 58         toloweranderasepunct( s );
 59         vec.push_back(s);
 60     }
 61 }
 62 
 63 void toloweranderasepunct( string &str)
 64 {
 65     string::iterator it = str.begin();
 66     while( it != str.end())
 67     {
 68         if(ispunct(*it))
 69         {
 70             it = str.erase(it);
 71         }else if(isupper(*it))
 72         {
 73             *it = tolower(*it);
 74             it++ ;
 75         }else
 76             it++ ;
 77     }
 78 }
 79 
 80 
 81 //veersion:search a line
 82 vector<string> querystr( vector<string> &vec)
 83 {
 84     string line ;
 85     vector<string> dup;
 86     while( getline( cin, line ) )
 87     {
 88         istringstream stream(line);
 89         string str ;
 90         while( stream >> str)
 91         {
 92             for(vector<string>::iterator it = vec.begin();
 93                     it != vec.end();
 94                     ++it)
 95             {
 96                 string::size_type pos = it->find(str);
 97                 if( pos!= string::npos )//success
 98                 {
 99                     cout << *it << endl ;
100                     dup.push_back(*it);
101                 }
102             }
103         }
104     }
105     return dup ;
106 }
107 
108 /*
109 //version1:search ch or string;
110 void querystr( vector<string> &vec )//为什么不能用const
111 {
112     string str ;
113     while( cin >> str)
114     {
115         for(vector<string>::iterator it = vec.begin();
116             it != vec.end();
117             ++it)
118         {
119             string::size_type pos = it->find(str);
120             if( pos!= string::npos )//success
121                 cout << *it << endl ;
122         }
123     }
124 }
125 
126 */

 

C++学习之字符串查询

标签:style   blog   color   io   os   ar   for   div   sp   

原文地址:http://www.cnblogs.com/xfxu/p/3985194.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!