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表达式的类型是不可知的,只能通过new
    auto
    关键字捕获

    当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操作符!太棒了