首页 > 代码库 > C++学习之字符串查询
C++学习之字符串查询
本博文主要探讨字符串的相关操作。
问题描述:将一篇文本录入,实现查询功能。
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 )//为什么不能用const111 {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 )//success121 cout << *it << endl ;122 }123 }124 }125 126 */
C++学习之字符串查询
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。