11.8
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main(int argc, char * argv[])
{
string word;
vector<string> words;
while(cin>>word)
{
if(find(words.begin(), words.end(), word) == words.end())
words.push_back(word);
}
for (auto &w : words)
cout << w << " ";
cout << endl;
return 0;
}
11.9
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <list>
#include <map>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[])
{
ifstream in(argv[1]);
if (!in)
{
cerr << "无法打开文件" << endl;
exit(1);
}
void tran(string &word)
{
for(int p = 0; p<word.size(); ++p);
{
if(word[p] < 'Z' && word[p] > 'A')
word[p] -=( 'A' - 'a');
else if (word[p] = ',' || word[p] == '.' )
word[p] = word.erase(p,1);
}
}
map<string, list<int>> word_lineno;
string word;
string line;
int lineno;
while (getline(in, line))
{
lineno++;
istringstream l_in(line);
while(l_in >> word)
{
tran(word);
word_lineno[word].push_back(lineno);
}
}
for(const auto &w : word_lineno)
{
cout << word.lineno << "所在行 " ;
for (const suto &i :w.lineno)
cout << i << " ";
cout << endl;
}
return 0;
}
11.10
由于有序容器要求关键字类型必须支持比较操作<, 因此map<vector<int>::iterator,int> ml;
是可以的,vector的迭代器支持比较操作。而list元素不是连续存储,其迭代器不支持比较操作
11.11
答案
首先用typedef定义与compareisbn相容的函数指针类型,然后用此类型声明multiset即可
typedef bool (*pf) (const Sales_data &, const Sales_data &);
multiset<Sales_data, pf> bookstore(compareisbn);