关联容器(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;
} 
原文地址:https://www.cnblogs.com/hometown/p/3370572.html