C++ 这个C++;/C++;11.你的意思是什么?
我有一小段代码。我不明白这个结构是什么意思。我知道这段代码从输入中读取数字,并在无序的_映射中计算其频率。但是什么是C++ 这个C++;/C++;11.你的意思是什么?,c++,c++11,C++,C++11,我有一小段代码。我不明白这个结构是什么意思。我知道这段代码从输入中读取数字,并在无序的_映射中计算其频率。但是什么是[&]?那么(int x)的含义是什么?输入(cin)代表什么?我是说括号里的“cin”?每个for_如何从input(cin)迭代到空eof参数?我不了解整个建筑 unordered_map<int,int> frequency; istream_iterator<int> input(cin); istream_iterator<int> e
[&]
?那么(int x)
的含义是什么?输入(cin)
代表什么?我是说括号里的“cin”?每个for_如何从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]++; });
无序映射频率;
istream_迭代器输入(cin);
istream_迭代器eof;
对于每个(输入、eof、[&](int x)
{频率[x]++;});
这是STLstd::for_each(非C++11)迭代输入,直到等于eof;为每个值调用lambda[&](int x){frequency[x]+;}
因此,该代码计算istream中字符的频率;将它们保存到映射中允许您从中迭代提取项,并将其传递给构造函数。eof
对象解释如下:
这个迭代器有一个特殊的值:流的末尾;当
迭代器设置为:该值已到达流的末尾
(应用于流的运算符void*返回false)或已被
使用其默认构造函数构造(不将其与
任何基本的流对象)
是一个循环构造,它接受迭代器#1并递增它,直到它与迭代器#2相等。这里它使用迭代器包装标准输入并递增它(转换为提取项),直到没有更多的输入可使用——这使得input
compare等于eof
,循环结束
构造[&](intx){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);
无序映射频率;//这需要全球化
istream_迭代器输入(cin);
istream_迭代器eof;
无效消耗(整数x){
频率[x]++;
}
对于每个单元(输入、eof、消耗);
简而言之:这段代码从标准输入中读取整数,直到所有可用数据被消耗,并在地图中记录每个整数的出现频率。问题有两个部分
std::istream\u迭代器
由一些std::istream&s
构造而成,在取消引用时,其行为类似于{tx;s>>x;return x;}
。一旦提取失败,迭代器就等于默认构造的迭代器,它充当“结束”迭代器
流迭代器允许您将流视为令牌的容器。例如:
std::vector<int> v(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>());
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
这个f
可以作为一个普通的自由函数来编写,但是自由函数必须出现在名称空间范围内,或者作为本地类的静态成员函数。(这实际上就是lambda表达式的类型!)请注意,lambda表达式的类型是不可知的,只能通过newauto
关键字捕获
当lambda充当可以捕获环境状态的复杂函数对象时,它们会变得更加有用。您的示例可以这样编写:
auto f = [](int a, int b) -> double { return double(a) / double(b); };
auto q = f(1, 2); // q == 0.5
auto f = [&frequency](int x) -> void { ++frequency[x]; };
将捕获出现在第一个方括号之间的变量。此lambda等效于以下本地类和对象:
struct F
{
F(std::unordered_map<int, int> & m) : m_(m) { }
void operator()(int x) { ++m_[x]; }
private:
std::unordered_map<int, int> & m_;
} f;
struct F
{
F(std::无序映射&m):m(m){}
void运算符()(int x){++m_x];}
私人:
标准::无序地图&m;
}f;
捕获列表中没有
和的变量按值捕获,即在closure对象中创建一个副本。作为一个简短的手,你可以说<代码> [/] <代码>或<代码> [& ] /C++ >分别按值或引用捕获每一个。< /P>查看新的C++ LAMDA操作符!太棒了