这个C++/C++ 11构造意味着什么?

bal*_*ent 5 c++ c++11

我有这么短的代码片段.我不明白这种结构意味着什么.我知道这段代码从输入中读取数字并在unordered_map中计算其频率.但是什么[&]呢?那是什么意思(int x)?这input(cin)代表什么?我的意思是括号中的"cin"?而for_each如何迭代input(cin)到空eof参数?我不明白这整个建筑.

unordered_map<int,int> frequency;
istream_iterator<int> input(cin);
istream_iterator<int> eof;

for_each(input, eof, [&] (int x)
    { frequency[x]++; });
Run Code Online (Sandbox Code Playgroud)

Jon*_*Jon 6

istream_iterator允许您迭代地从一个istream传递给构造函数的项目中提取项目.eof因此解释了这个目标:

存在一个特殊的迭代器值:流末尾; 当迭代器设置为此值时,要么已到达流的末尾(应用于流的operator void*返回false),或者已使用其默认构造函数构造(不将其与任何basic_istream对象关联).

for_each是一个循环结构,它接受迭代器#1并递增它直到它与迭代器#2相等.这里需要迭代器包装标准输入cin并递增它(转换为提取项),直到没有更多的输入消耗 - 这使得input比较等于eof并且循环结束.

该构造[&] (int x) { frequency[x]++; }是一个匿名函数 ; 它只是一种编写函数内联的简写方法.使用可以获得大致相同的效果

unordered_map<int,int> frequency; // this NEEDS to be global now
istream_iterator<int> input(cin);
istream_iterator<int> eof;

void consume(int x) {
    frequency[x]++;
}

for_each(input, eof, consume);
Run Code Online (Sandbox Code Playgroud)

简而言之:此代码从标准输入读取整数,直到消耗了所有可用数据,并在映射中保留每个整数的出现频率的计数.