关联容器(map):支持高效查找的容器,一种键值对的集合。
#include <iostream> #include <string> #include <map> #include <vector> using namespace std; //根据空格等将字符串,拆分成多个单词。 vector<string> split(const string& s) { vector<string> ret; typedef string::size_type string_size; string_size i=0; while(i!=s.size()) { while(i!=s.size() && isspace(s[i])) { ++i; } string_size j=i; while(j!=s.size() && !isspace(s[j])) { ++j; } if(i!=j) { ret.push_back(s.substr(i,j-i)); i=j; } } return ret; } //得到一个单词为键,所在行的序列为值的一个关联容器集合 map<string,vector<int> > xref(istream & in,vector<string> find_words(const string&)=split) { string line; int line_number=0; map<string,vector<int> > ret; while(getline(in,line)) //读取分隔每一行的输入 { ++line_number; vector<string> words=find_words(line);//找每一行单词的集合。 for(vector<string>::const_iterator it=words.begin();it!=words.end();++it) { ret[*it].push_back(line_number); //*it:一个单词 } } return ret; } int main() { map<string ,vector<int> > ret=xref(cin); for(map<string,vector<int> >::const_iterator it=ret.begin();it!=ret.end();++it) { cout<<it->first <<"在行:"; //输出一个单词 vector<int>::const_iterator line_it=it->second.begin(); cout<<*line_it; ++line_it; while(line_it!=it->second.end()) { cout<<","<<*line_it; ++line_it; } cout<<endl; } return 0; }
人生无处不代码,没有代码不人生。