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 )//为什么不能用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 */
时间: 2024-10-25 20:57:43

C++学习之字符串查询的相关文章

Redis源码学习:字符串

Redis源码学习:字符串 1.初识SDS 1.1 SDS定义 Redis定义了一个叫做sdshdr(SDS or simple dynamic string)的数据结构.SDS不仅用于 保存字符串,还用来当做缓冲区,例如AOF缓冲区或输入缓冲区等.如下所示,整数len和free分别表示buf数组中已使用的长度和剩余可用的长度,buf是一个原生C字符串,以\0结尾. sds就是sdshdr中char buf[]的别名,后面能看到,各种操作函数的入参和返回值都是sds而非sdshdr.那sdshd

程序员编程技术学习笔记——字符串包含

程序员编程技术学习笔记--字符串包含 1.题目描述 给定两个分别由字母组成的字符串A和字符串B,字符串B的长度比字符串A短.请问,如何最快地判断字符串B中所有字母是否都在字符串A里?为了简单起见,我们规定输入的字符串只包含大写英文字母,请实现函数boolStringContains(string &A, string &B) 比如,如果是下面两个字符串: String 1:ABCD String 2:BAD 答案是true,即String2里的字母在String1里也都有,或者说Strin

Lucene学习:lucene查询

1.1. Lucene查询 在学习Lucene的查询方法前,先了解一下下面几个类: 1.1.1. Query 封装某种查询类型的具体子类,配置查询的查询条件.Query实例将被传递给IndexSearcher的search方法.下面是常用的Query子类: l 通过项进行搜索 TermQuery类 l 在指定的项范围内搜索 TermRangeQuery类 l 通过字符串搜索 PrefixQuery类 l 组合查询 BooleanQuery类 l 通过短语搜索 PhraseQuery类 l 通配符

python学习之 字符串前&#39;r&#39;的用法

python学习之 字符串前'r'的用法 在打开文件的时候open(r'c:\....') 加r和不加''r是有区别的 'r'是防止字符转义的 如果路径中出现'\t'的话 不加r的话\t就会被转义 而加了'r'之后'\t'就能保留原有的样子 在字符串赋值的时候 前面加'r'可以防止字符串在时候的时候不被转义 原理是在转义字符前加'\' 例: s=r'\tt' print(s) Output: '\tt' s='\tt' print(s) Output: '        t' python学习之

java学习-关于字符串String

有必要总结记录一下java的学习,否则,永远只是记忆碎片化和always google(费时) 刚好,小伙伴给了一份自己做的review,在学习的过程中,update一下自己的见解和学习内容: 关于String: 1 package string_keywords; 2 /** 3 * 参考url: http://developer.51cto.com/art/201106/266454.htm 4 * 5 * 常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.cla

MySQL基础学习之数据查询

一般查询 SELECT * FROM 表名 SELECT 属性名  FROM  表名 条件查询 SELECT 属性名 FROM 表名  WHERE 条件表达式 查询数据值1,数据值2的表单 SELECT *  FROM  表名  WHERE  属性名 [NOT] IN(数据值1,数据值2....) 查询数值1,数据2的表单 SELECT *  FROM  表名  WHERE  属性=值  AND 属性1=值1 查询数值1到数值2之间的表单 SELECT *  FROM  表名  WHERE  属

《python基础教程(第二版)》学习笔记 字符串(第3章)

<python基础教程(第二版)>学习笔记 字符串(第3章)所有的基本的序列操作(索引,分片,乘法,判断成员资格,求长度,求最大最小值)对字符串也适用.字符串是不可以改变的:%左侧是格式字符串,右侧是需要格式化的值print '%s=%d' % ('x',100) ==> x=100%% 格式字符串中出现 %模板字符串:from string import Templates=Template('$x is 100');  s.substitute(x='ABC');  ==> '

R语言学习(5)-字符串和因子

字符串和因子 1.字符串 创建字符串 > c("HELLO","WORLD") [1] "HELLO" "WORLD" 使用paste函数连接字符串 > paste(c("hello","hi"),"world") [1] "hello world" "hi world" > paste(c("hel

python3学习之字符串

s='this is test message' s.capitalize()    首字母大写,其它小写 s.find(sub[, start[, end]])      在指定范围内(默认全部字符串),查找sub是否包含在字符串中,包含时                                             返回第一次匹配的index,否则返回-1 s.rfind(sub[, start[, end]])    在指定范围内(默认全部字符串),查找sub是否包含在字符串中,