我从c ++编程语言中复制了这个简单的程序,但是我无法按照需要运行它。我错过了什么吗? 基本上,程序将在我点击返回后输出“输入结束”,然后从cin重复输入。它永远不能进入下一个声明。我试图使用向量(下面评论两个语句),相同。试过Vc6和vs2008。
#include <iostream>
#include <map>
#include <algorithm>
#include <string>
#include <iterator>
#include <vector>
using namespace std;
map<string, int> histogram;
void record(const string &s)
{
histogram[s]++; //this is pretty strange, however it does work!
cout<<"recorded:"<<s<<" occurance="<<histogram[s]<<"\n";
}
void print(const pair<const string,int> &r)
{
cout<<r.first<<' '<<r.second<<'\n';
}
int main()
{
istream_iterator<string> ii(cin);
istream_iterator<string> eos;
cout<<"input end\n";
for_each(ii,eos,record); //this statement cannot get out why? It repeats the keyboard input
//vector<string> b(ii,eos);
//for_each(b.begin(),b.end(),record);
for_each(histogram.begin(),histogram.end(),print); //program never comes here why?
}
运行结果:
a b c
输入结束
记录:发生率= 1
记录:b出现= 1
记录:c occurrence = 1
1 2 3
记录:1次出现= 1
记录:2次出现= 1
记录:3次出现= 1
答案 0 :(得分:5)
istream_iterator
将继续,直到它到达流的末尾,而cin
通常不会发生。
cin
会遇到一个流结束,导致你的语句终止,当它被重定向到一个文件时(当它到达文件末尾时),或者如果它正在接收控制台输入你可以发送按CTRL-Z(Linux上的CTRL-D,iirc)结束流。您可能需要在之后按Enter键。
请注意,cin
在执行此操作后将无法使用,因此在此之后您无法读取更多输入。
在遇到流末尾之前,ii
将保持有效并继续从流中请求更多数据(在控制台的情况下)。
解决方案是不使用for_each
,而是使用手动while
循环,当您满足任何条件时,您可以将其打破。