一個很精彩的關於STL的例程

下面是C++ primer上關於STL的一個完整的歷程,程序的目的在於統計需要查找的一個英文單詞在一個英文文本文件中出現多少次,以及輸有要查找單詞出現的那一行。

下面的程序可以幫助你使用STL時有一個更便捷的參考,在徹底弄清楚下面的程序後你完全可以改寫一下,統計出一個英文文本中每個單詞出現的次數。這樣你就可以根據這個結果查找那些不會的單詞,重點查一下詞典,這樣應該能更好的去閱讀一篇英文文章。


#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <map>
#include <string>


using namespace std;

void make_map(ifstream&,vector<string>&,map<string,map<vector<string>::size_type,int> >&);
ifstream& open_file(ifstream&,string&);
void make_vector(ifstream&,vector<string>&);

//新建文件輸入流並與文件關聯
ifstream& open_file(ifstream& inFile,string& filename)
{
	cout << "請輸入文件名:" << endl;
	cin >> filename;

	inFile.close();
	inFile.clear();     //重置輸入流的狀態位
	inFile.open(filename.c_str());
	return inFile;
}

//建立vector<string>類型的對象,元素爲文本的一行字符串
void make_vector(ifstream& inFile,vector<string>& file_line)
{
	string strline;       //文本中取出一行放入strline中

	//vector<string>類型的對象引用file_line中的每個元素存放文本的一行內容,文本由多少行,file_line中就有多少元素
	while(getline(inFile,strline))
	{
		file_line.push_back(strline);
	}
}

//建立map<string,map<vector<string>::size_type,int> >用於存儲在文本中出現的單詞(string)
//出現的行號(vector<string>::size_type),以及此行出現的次數(int)
void make_map(ifstream& inFile,vector<string>& file_line,map<string,map<vector<string>::size_type,int> >& wordInfo)
{
    vector<string>::size_type linecount = file_line.size();  //獲取文本的行數信息

    //以下代碼將要建立map<string,map<int,int> >對象的引用wordInfo,用於存儲文本中單詞
    //的信息,包括出現的次數,在哪行出現過,以及此行中出現的次數
    for(vector<string>::size_type ix=0; ix!=linecount; ++ix)
    {
    	istringstream inword(file_line[ix]); //建立字符串的輸入流,用於對一行文本進行解析單詞
    	if(!inword)
    		cerr << "文本行載入出錯!" << endl;
    	string word; 
    	while(inword>>word)  //從字符串輸入流中逐個取出單詞
    	{
    		//如果文本中還沒有出現過這個單詞,在map中直接插入此單詞,以及當前行數,當前在此行出現的次數1
    		if(!wordInfo.count(word))
    		{
    			map<vector<string>::size_type,int> wordIndex;
    			wordIndex.insert(make_pair(ix,1));
    			wordInfo.insert(make_pair(word,wordIndex));
    		}
    		//次word單詞已經在文本中出現過
    		else
    		{
    			//但是word單詞沒有在此行出現過
    			if(!wordInfo.find(word)->second.count(ix))
    			{
    				pair<vector<string>::size_type,int> curLine = make_pair(ix,1);
    				wordInfo.find(word)->second.insert(curLine);
    			}
    			else  //如果當前行出現過此單詞
    			{
    				++(wordInfo.find(word)->second.find(ix)->second);
    			}
    		}
    	}
    }
}

int main(int argc,char *argv[])
{
	string word;               //將要查找的單詞
	string filename;           //將要查找的文件名
	ifstream inFile;           //關聯文件的輸入流

    //調用open_file,讀入文件,如果打開文件失敗,重新輸入文件名
	while(!open_file(inFile,filename))
	{
		cerr << "文件載入錯誤!";
	}

	vector<string> file_line;   //每個元素存儲文本的一行字符串
	make_vector(inFile,file_line);   //調用make_vector,建立vector對象

	map<string,map<vector<string>::size_type,int> > wordInfo;  //用於存儲單詞的信息
	make_map(inFile,file_line,wordInfo);     //調用make_map建立單詞信息
	cout << "請輸入要查詢的單詞";
	while(cin >> word)
	{
		int count = 0;
		map<string,map<vector<string>::size_type,int> >::iterator it = wordInfo.find(word);
		if(it == wordInfo.end())
		{
			cout << "此單詞不存在!";
			cout << "請輸入要查詢的單詞";
			continue;
		}

		map<vector<string>::size_type,int>::iterator beg = it->second.begin(),
		                                             end = it->second.end();

		while(beg!=end)
		{
			count = count+beg->second;
			++beg;
		}
		cout << word << "共出現" << count << "次!" << endl;

		beg = it->second.begin();

		while(beg != end)
		{
			cout << "行數" << beg->first+1 << ":" << file_line[beg->first] << endl;
			++beg;
		}
		cout << "請輸入要查詢的單詞:";
	}

	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章