Essencial C++ 第三章學習記錄即習題

     在這一章的內容中,集中介紹了泛型指針 Iterator等泛型編程風格,說白了就是讓我們的程序有更好的通用性,在這章的內容中,比較不好理解的是函數對象 function object,這裏我給出兩個大佬的博客,看完之後可以有初步的瞭解

https://blog.csdn.net/He_9520/article/details/78241533

https://blog.csdn.net/CV_Jason/article/details/83899253

 

下面給出課後習題的一些做法,本人c++小白,歡迎指點,編譯環境 VS2015

1. 寫一個讀取文本文件的程序,將文件中的每個單字存入map。map的key是單字,value是單字在文本文件中出現的次數。再定義一份由“排除字眼”組成的set,其中包含諸如a, an , the, or, and ,but之類的單字。將某個單字放入map之前,先確定該單字並不在set中。一旦文本文件讀取完畢,請顯示一份單子清單,並顯示各單字出現的次數。你甚至可以再加以拓展,在顯示單字之前,允許用戶查詢某個單字是否出現於文本文件中

// chapter01.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"
#include<iostream>
#include<map>
#include<set>
#include<fstream>
#include<algorithm>
#include<string>
using namespace std;


void show(string c) {
	cout << c << " ";
}

int main() {
	ifstream in_file("Text1.txt");
	//ofstream out_file("Text1.txt");
	map<string, int> words; //存放不在排除字眼中的單字以及出現的次數
	set<string> ban; //存放排除字眼
	set<string>all_words; //用來存放文本中的所有單字,供用戶查詢
	string word;
	string cin_word;
	ban.insert("a");
	ban.insert("an");
	ban.insert("the");
	ban.insert("and");
	ban.insert("or");
	ban.insert("but");
	if (!in_file) {
		cout << "文件未能打開" << endl;
	}
	else {
		while (in_file >> word) {
			all_words.insert(word);
            //當在set中存在時,不存入map中
			if (ban.count(word)) {
				continue;
			}
			words[word]++;
		}
		cin >> cin_word;
		while (cin_word.compare("0")!=0) {
			if (all_words.count(cin_word)) {
				cout << "文章中存在" << endl;
			}
			else
			{
				cout << "不存在" << endl;
			}

			cin >> cin_word;
		}
		map<string, int>::iterator ite = words.begin();
		for (;ite != words.end();ite++) {
			cout << ite->first << ":" << ite->second << endl;
		}
	}
	
	return 0;
}



2.讀取文本文件內容,和練習3.1一樣,並將內容存儲於vector中,以字符串長度爲依據,對vector排序。定義一個函數對象並傳給sort,這個函數對象接受兩個字符串,當第一個字符串的長度小於第二字符串的長度時,返回True.最後打印排序後的vector。

// chapter01.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;


class mySort {
public:
	bool operator()(string s1, string s2) {
		return s1.length()<s2.length() ? true : false;
	}
};

void myShow(string st) {
	cout << st<<endl;
}

int main() {
	ifstream in_file("Text1.txt");
	vector<string> vec;
	string word;
	mySort my;
	if (!in_file) {
		cout << "文件打開失敗" << endl;
	}
	else {
		while (in_file>>word) {
			vec.push_back(word);
		}
		sort(vec.begin(), vec.end(), my);
		for_each(vec.begin(), vec.end(), myShow);
	}
	
	return 0;
}



3. 定義一個map,以家庭姓氏爲key,value爲家庭所有小孩的名字。令此map至少容納六筆數據,允許用戶根據姓氏來查詢,並得以打印map內的每一筆數據

// chapter01.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"
#include<iostream>
#include<algorithm>
#include<string>
#include<map>
#include<vector>
using namespace std;

void my_show(string name) {
	cout << name << endl;
}

int main() {
	map<string, vector<string>> family;
	typedef pair<string, vector<string>> in_pair;
    //由於這裏說是存儲家庭所有小孩的名字,所以這裏我用了一個vector來存儲
	vector<string> vec;
	string name;
	map<string, vector<string>>::iterator ite;
	vec.push_back("zi hao");
	vec.push_back("messi");
	vec.push_back("weixiao");
	family.insert(in_pair("zhao", vec));
	family.insert(in_pair("qian", vec));
	family.insert(in_pair("sun", vec));
	family.insert(in_pair("li", vec));
	family.insert(in_pair("zhou", vec));
	family.insert(in_pair("wu", vec));

	while (cin>>name) {
		if ((ite = family.find(name))!=family.end()) {
			cout << "查找成功 \n";
			for_each(ite->second.begin(),ite->second.end(),my_show);
		}
		else {
			cout << "查找失敗 \n";
		}
	}
	return 0;
}



這裏在結束輸入的時候是用了CTRL+Z  關於這個操作的原理,我參考了其他大佬的博客

https://bbs.csdn.net/topics/391967370

https://blog.csdn.net/u010632454/article/details/9324869

4. 利用 istream_iterator 從標準輸入設備讀取一連串整數,利用 ostream_iterator 將其中的奇數寫入某個文件,每個數值之間以空格分隔。再利用ostream_iterator 將偶數寫到另一個文件,每個數值單獨放到一行中

// chapter01.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"
#include<iostream>
#include<algorithm>
#include<vector>
#include<iterator>
#include<fstream>
using namespace std;

int main() {
	
	istream_iterator<int> is(cin);
	istream_iterator<int> eof;
	vector<int> vec;
	ofstream outA("jishu.txt",ios_base::app);
	ofstream outB("oushu.txt",ios_base::app);
    //第二個元素用來表示各個元素被輸出時的分隔符
	ostream_iterator<int> osA(outA, " ");
	ostream_iterator<int> osB(outB, "\n");
	copy(is, eof, back_inserter(vec));

	vector<int>::iterator ite = vec.begin();
	for (;ite != vec.end();ite++) {
		if (*ite % 2 == 0) {
			copy(ite, ite+1, osB);
		}
		else {
			copy(ite, ite+1, osA);
		}
	}
	return 0;
}



 

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