11.9
#include <iostream>
#include <fstream>
#include <sstream>
#include <list>
#include <map>
#include <string>
using namespace std;
void trans(string &word)
{
if (isupper(word[0]))
word[0] = tolower(word[0]);
if (ispunct(word[0]))
word.erase(word.begin());
if (ispunct(word[word.size() - 1]))
word.pop_back();
}
int main(int argc, char *argv[])
{
map<string, list<int>> index;
ifstream in(argv[1]);
string line, word;
int line_no = 0;
while (getline(in, line)) {
++line_no;
istringstream win(line);
while (win >> word) {
trans(word);
index[word].push_back(line_no);
}
}
for (auto e : index) {
cout << e.first << ": ";
for (auto i : e.second)
cout << i << " ";
cout << endl;
}
return 0;
}
11.10 map的关键字必须支持<操作,vector迭代器支持<操作,可以定义迭代器到int的map;list的元素不是连续存储,迭代器不支持<操作,故不能。
11.11 可以定义一个函数指针来实现: typedef bool (*pf) (const Sales_data &, const Sales_data &); multiset<Sales_data, pf> bookstore(compareIsbn);
11.12
#include <iostream>
#include <utility>
#include <vector>
using namespace std;
int main()
{
vector<pair<string, int>> pvec;
string s;
int i;
while (cin >> s >> i) {
// pair<string, int> p = {s, i};
// pair<string, int> p{s, i};
auto p = make_pair(s, i);
pvec.push_back(p);
}
for (auto e : pvec) {
cout << e.first << " " << e.second << endl;
}
return 0;
}
11.13 见上题程序中的注释
11.14
#include <iostream>
#include <map>
#include <vector>
#include <utility>
using namespace std;
void add_family(map<string, vector<pair<string, string>>> &families, const string &family)
{
if (families.find(family) == families.end())
families[family] = vector<pair<string, string>>();
}
void add_kid(map<string, vector<pair<string, string>>> &families, const string &family,
const string &kid, const string &birth)
{
families[family].push_back(make_pair(kid, birth));
}
int main()
{
map<string, vector<pair<string, string>>> families;
add_family(families, "Li");
add_kid(families, "Li", "Jim", "20080828");
add_kid(families, "Li", "Jack", "20050413");
add_kid(families, "Wang", "Lucy", "20090101");
add_family(families, "Wang");
for (auto f : families) {
cout << f.first << ": ";
for (auto c : f.second)
cout << c.first << " " << c.second << "; ";
cout << endl;
}
return 0;
}