在這一章的內容中,集中介紹了泛型指針 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;
}