#ifndef GUARD_split_h
#define GUARD_split_h
#include <vector>
#include <string>
std::vector<std::string> split(const std::string&);
#endif
#include <vector>
#include <string>
#include <cctype>
#include "split.h"
using std::vector;
using std::string;
using std::isspace;
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;
}
#include <algorithm>
#include <map>
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include "split.h"
using namespace std;
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)
if(find(ret[*it].begin(),ret[*it].end(),line_number)==ret[*it].end())
ret[*it].push_back(line_number);
}
return ret;
}
int main()
{
ifstream infile;
infile.open("1.txt");
map<string,vector<int> > ret=xref(infile);
for (map<string, vector<int> >::const_iterator it = ret.begin();it != ret.end(); ++it) {
cout << it->first << " occurs on line(s): ";
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;
}
system("pause");
return 0;
}