#include <cctype>
#include <iostream>
#include <string>
#include <vector>
#include <map> //使用关联式容器map<键,值> m
using namespace std;
vector<string> split(const string&);
//把各行的单词放进键值对中,即单词和单词出现的行数,行数保存在一个向量中
map<string,vector<int> > xref(istream& in, vector<string> find_words(const string&) = split)
{
string line;
int line_numbers = 0;
map<string,vector<int> > ret;
while (getline(cin,line))
{
++line_numbers;
vector<string> words = find_words(line); //调用split函数
for (vector<string>::const_iterator iter = words.begin(); iter != words.end(); ++iter)
{
ret[*iter].push_back(line_numbers); //保存单词和对应的行数
}
}
return ret;
}
int main()
{
map<string,vector<int> > ret = xref(cin);
for (map<string,vector<int> >::const_iterator iter = ret.begin(); iter != ret.end(); ++iter)
{
cout<<iter->first<<" 单词位于的行为: ";
vector<int>::const_iterator line_iter = iter->second.begin();
cout<< *line_iter; //输出单词所在行
++line_iter; //行数自增
while (line_iter != iter->second.end()) //输出单词所在的其他行
{
cout<<", "<< *line_iter;
++line_iter;
}
cout<<endl;
}
cout<<endl;
return 0;
}
//把一窜字符中空格去掉然后保存各单词
vector<string> split(const string& s1)
{
vector<string> s;
typedef string::size_type string_size;
string_size i = 0;
while (i != s1.size())
{
while (i != s1.size() && isspace(s1[i]))
++i;
string_size j = i;
while (j != s1.size() && !isspace(s1[j]))
++j;
if(i !=j)
{
s.push_back(s1.substr(i,j - i));
i = j;
}
}
return s;
}
统计各单词出现的行数---键值对
最新推荐文章于 2023-08-23 21:42:08 发布