Accelerated C++ Exercise 7-0(2)

本文介绍了一种从输入流中读取字符串并按空白字符进行拆分的方法,同时提供了统计单词出现频率的功能。该方法首先定义了一个拆分函数用于去除空白字符并将字符串分割成单词列表,接着使用了一个函数来读取文本并统计每个单词出现的行号。
#ifndef GRAUD_split_h
#define GRAUD_split_h
#include<vector>
#include<string>

std::vector<std::string> split(const std::string&);

#endif
#include <cctype>   
#include <string>   
#include <vector>   
   
#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;   
   
    // invariant: we have processed characters `['original value of `i', `i)'   
    while (i != s.size()) {   
        // ignore leading blanks   
        // invariant: characters in range `['original `i', current `i)' are all spaces   
        while (i != s.size() && isspace(s[i]))   
            ++i;   
   
        // find end of next word   
        string_size j = i;   
        // invariant: none of the characters in range `['original `j', current `j)' is a space   
        while (j != s.size() && !isspace(s[j]))   
            ++j;   
   
        // if we found some nonwhitespace characters   
        if (i != j) {   
            // copy from `s' starting at `i' and taking `j' `\-' `i' chars   
            ret.push_back(s.substr(i, j - i));   
            i = j;   
        }   
   
    }   
    return ret;   
} 

#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <vector>

#include "split.h"

using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::istream;
using std::map;
using std::string;
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);
	}
	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<<" 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值