容器的綜合應用:文本查詢程序

需求

程序讀取用戶指定的任意文本文件,允許用戶從該文件中查找單詞。查詢結果是該單詞出現的次數,并列出每次出現所在行,如果某單詞在同一行中多次出現,程序將只顯示該行一次。行號按升序顯示,即第 7 行應該在第 9 行之前輸出,依此類推。例如,以本章的內容作為文件輸入,然后查找單詞“element”。輸出的前幾行應為:

element occurs 125 times
(line 62) element with a given key.
(line 64) second element with the same key.
(line 153) element |==| operator.
(line 250) the element type.
(line 398) corresponding element.
后面省略了大約 120 行。

?

看著書上的例子,自己寫了下,大致思路是

讀取文件,將文件以行為單位,放入vector<string>,再遍歷vector<string>,將每行每個單詞讀入map< string,set<unsigned> >中,最后從map中查找讀取

?

注意的地方

程序是不區分大小寫的,還需要去掉文章中的標點需要調用函數

頭文件#include<cctype>

ispunct() 檢查是否是非空格、非數字和非英文字母,類似函數isspace,isdigit,isalpha

tolower() 把字符轉換成小寫字母

對const成員的迭代器需要用const_iterator

?

對于內置類型,和長度比較短(8字節以內)的淺層結構,類等對象,傳值比傳引用效率更高。

對超過8字節的對象,一般傳引用效率更高。

但實際上傳引用或傳值的選擇,主要取決于功能需求而非效率需求。

?

詳解

獲取文件對象:

1 ifstream& open_file(ifstream &in,const string &file)
2 {
3     in.close();
4     in.clear();
5     in.open(file.c_str());
6     return in;
7 }

?

讀文件,創建vector和map

 1 void TextQuery::read_file(ifstream &in)
 2 {
 3     store_file(in);
 4     build_map();
 5 }
 6 
 7 void TextQuery::store_file(ifstream &in)
 8 {
 9     string textline;
10     while(getline(in,textline))
11         lines_of_text.push_back(textline);
12 }
13 
14 void TextQuery::build_map()
15 {
16     for(line_no line_num = 0;line_num != lines_of_text.size();line_num++)
17     {
18         istringstream line(lines_of_text[line_num]);
19         string word;
20         while(line >> word)
21         {
22             word = cleanup_str(word);
23             word_map[word].insert(line_num);
24         }
25 
26     }
27 }

?

處理單詞中的符號,忽略大小寫

 1 string TextQuery::cleanup_str(const string &word)
 2 {
 3     string ret;
 4     for(string::const_iterator it = word.begin();it != word.end();++it)
 5     {
 6         if(!ispunct(*it))
 7             ret += tolower(*it);
 8     }
 9     return ret;    
10 }

?

查找單詞,返回值是map的第二個元素set,用來保存單詞所在的行號

1 set<TextQuery::line_no> TextQuery::run_query(const string &query_word) const
2 {
3     map< string,set<line_no> >::const_iterator loc = word_map.find(query_word);
4     if( loc == word_map.end() )
5         return set<line_no>();    //找不到返回空的set對象
6     else
7         return loc ->second;
8 }

?

返回查找結果,這里有個漏洞,查找單詞的數目是為單詞所出現的行數(因為set不存儲重復元素)

void TextQuery::print_result(set<line_no> locs,const string &query_word)
{cout<<query_word<<":"<<locs.size()<<endl;set<line_no>::iterator it = locs.begin();while(it != locs.end()){cout<<"(line "<<*it+1<<") ";cout<<lines_of_text[*it]<<endl;it++;}
}

?

寫了兩個輔助函數,并未調用,為了查看vector和map中的內容

 1 void TextQuery::show_vec()
 2 {
 3     vector<string>::iterator ite = lines_of_text.begin();
 4     while(ite != lines_of_text.end())
 5         cout<<*ite++<<endl;
 6 }
 7 void TextQuery::show_map()
 8 {
 9     map< string,set<line_no> >::iterator loc = word_map.begin();
10     while(loc != word_map.end())
11     {
12         cout<<loc->first<<"\t";
13         set<line_no>::iterator it = (loc->second).begin();
14         while(it != (loc->second).end())
15         {
16             cout<<*it + 1<<" ";
17             it++;
18         }
19         cout<<endl;
20         loc++;
21     }
22 }

運行結果

?

代碼點此下載

轉載于:https://www.cnblogs.com/raichen/p/4900308.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256526.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256526.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256526.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Anaconda 安裝操作及遇到的坑

最近剛用Pytorch&#xff0c;編譯開源代碼的時候發現缺少n個package&#xff0c;原來是之前在Anaconda3 創建的虛擬環境各自是獨立的&#xff0c;tensorflow下安裝的不能在別的環境下使用&#xff0c;所以要重新安裝。然而關鍵是國內各種屏蔽資源&#xff0c;無法FQ去直接下載安…

IE瀏覽器歷史版本圖標大全

上個月IE團隊慶祝了IE的15周歲生日&#xff0c; 并曬了曬IE各個歷史版本的圖標&#xff1a; Internet Explorer 1.0 圖標 Internet Explorer 2.0 圖標 Internet Explorer 3.0 圖標 Internet Explorer 4.0 圖標 Internet Explorer 5.0 圖標 Internet Explorer 6.0 圖標 Internet…

7.Mybatis關聯表查詢(這里主要講的是一對一和一對多的關聯查詢)

視頻地址&#xff1a;http://edu.51cto.com/sd/be679 在Mybatis中的管理表查詢這里主要介紹的是一對一和一對多的關聯查詢的resultMap的管理配置查詢&#xff0c;當然你也可以用包裝類來實現。不過這里不說&#xff0c;做關聯查詢的步驟可以簡單的總結為以下的幾步&#xff1a;…

ANSYS——查看某一截面的云圖分布(也叫做切片圖)

1.確定截面的位置 此處以圖中紅色處截面為例 2.將工作平面經過坐標變化移動到指定截面處(工作平面的XY平面與截面重合) 工作平面坐標系默認是與總體坐標系重合的,這里是先平移再進行旋轉

深度學習之keras (一) 初探

之前一段時間里&#xff0c;學習過tensorflow和Pytorch也寫了點心得&#xff0c;目前是因為項目原因用了一段時間Keras&#xff0c;覺得很不錯啊&#xff0c;至少從入門來說對新手極度友好&#xff0c;由于keras是基于tensoflow的基礎&#xff0c;相當于tensorflow的高級API吧&…

swift:高級運算符(位運算符、溢出運算符、優先級和結合性、運算符重載函數)...

swift&#xff1a;高級運算符 http://www.cocoachina.com/ios/20140612/8794.html 除了基本操作符中所講的運算符&#xff0c;Swift還有許多復雜的高級運算符&#xff0c;包括了C語和Objective-C中的位運算符和移位運算。 不同于C語言中的數值計算&#xff0c;Swift的數值計算默…

收集、報告或保存系統活動信息:sar命令

2019獨角獸企業重金招聘Python工程師標準>>> 索引 sar命令的使用常用方法 查看網絡設備&#xff08;網卡&#xff09;的狀態信息查看socket使用情況查看cpu使用情況(默認)查看內存和交換空間使用情況查看內存的統計信息查看tty設備的活動狀態查看等待運行的進程數和…

【GOF23設計模式】原型模式

【GOF23設計模式】原型模式 來源&#xff1a;http://www.bjsxt.com/ 一、【GOF23設計模式】_原型模式、prototype、淺復制、深復制、Cloneable接口 淺復制 1 package com.test.prototype;2 3 import java.util.Date;4 5 /**6 * 淺復制7 */8 public class Sheep implements C…

ANSYS——自定義的梁截面中心(法線節點)的偏置,詳細全面

目錄 1、ANSYS梁的確定 2.關于梁截面的一些名詞 總體坐標系 梁截面坐標系 梁單元的坐標系

Deepfacelab 小白教程

不小心入了AI換臉的坑&#xff0c;但是感覺AI換臉很有意思&#xff0c;第一次感覺科研使我快樂。 目錄 一、AI換臉軟件簡介 二、Deepfacelab下載安裝 三、Deepfacelab Demo實現 四、Deepfacelab 填坑 五、總結 一、AI換臉軟件簡介 這個沒有具體使用過&#xff0c;目前我…

Underscore.js 的模板功能

Underscore是一個非常實用的JavaScript庫&#xff0c;提供許多編程時需要的功能的支持&#xff0c;他在不擴展任何JavaScript的原生對象的情況下提供很多實用的功能。 無論你寫一段小的js代碼&#xff0c;還是寫一個大型的HTML5應用&#xff0c;underscore都能幫上忙。目前&…

ANSYS——查看剖面圖的應力分布云圖以及工作平面的相關設置

剖面圖和切片圖其實差不多,只是切片圖只有一個截面,而剖面圖是切去一部分保留另一部分模型,不但可以看到截面處應力分布還可以看到剩余模型的應力分布 切片應力云圖可見:https://blog.csdn.net/qq_45769063/article/details/106357700 1.剖面云圖的查看 首先將工作平面的…

2016.8.2

高端內存映射方式 高端內存映射分為三種&#xff1a;永久映射、臨時映射和非連續動態內存映射。高端內存一般是指896MB以上的頁框&#xff0c;這段區間內核一般不能直接訪問。 1.永久映射 永久內核映射允許內核建立高端頁框到內核地址空間的長期映射。它們使用主內核頁表中的一…

深度學習之pytorch(三) C++調用

玩深度學習&#xff0c;個人覺得基于anaconda的python適合開發與測試&#xff0c;C適合實際的工程部署&#xff01;而pytorch官方有編譯好的libtorch&#xff0c;特別方便&#xff0c;適合于我這樣的伸手黨和手殘黨(win10下編譯tensorflow編譯了好久都沒通過&#xff0c;好憂傷…

ANSYS入門——模態分析步驟與實例詳解

目錄 一、ANSYS求解模態分析步驟 建模 施加載荷和求解

javascript庫之Mustache庫使用說明

一、簡單示例 代碼&#xff1a; 1 function show(t) { 2 $("#content").html(t); 3 } 4 5 var view { 6 title: YZF, 7 cacl: function () { 8 return …

Light OJ 1007

求區間歐拉函數平方和。。。 最后因為longlong 范圍爆了WA 了&#xff0c; 0.0 #include<bits/stdc.h> using namespace std; const int maxn 5000000 131; typedef unsigned long long LL;bool Com[maxn]; LL Num[maxn], Prim[maxn / 3]; int Cnt;void INIT() {Num[1]…

MVC架構設計——EF-Code First

詳情參考:http://www.cnblogs.com/guomingfeng/archive/2013/05/28/mvc-ef-repository.html轉載于:https://www.cnblogs.com/shuai7boy/p/5807678.html

機器學習(一) 基于sklearn庫的數據集劃分(交叉驗證)

機器學習中首要環節就是數據集的處理&#xff0c;其中數據集的處理從個人理解(如有錯誤敬請諒解)的角度來說包括兩個方面&#xff1a;數據集劃分和數據清理。其中數據集劃分是指訓練集、驗證集和測試集的數據類別劃分&#xff1b;數據清理是指數據的清洗、刪除等等方面。這兩天…

ANSYS——模態分析的理論基礎

目錄 一、模態分析理論基礎 線性與非線性 振動與固有頻率 振動方程與振動模態