统计各单词出现的行数---键值对

#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;
}      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值