• 王小品
    2020-01-07
    Y-Combinator被你说高深了。递归就是自己调用自己。lamda表达式想递归,困难在于不知道自己的函数名,怎么办?调用不了自己,难道还调用不了别人。所以lamda表达式调用了Y-Combinator去间接调用自己,而Y-Combinator只不过:一,记录lamda表达式;二,转调lamda表达式。这就好比普京受制于连任时间限制,如果想继续连任,则找个代言人Y-Combinator继任。代言人的唯一作用就是到期传位普京。

    作者回复: 哈哈,有意思的比喻。以前学过函数式编程?

    
     3
  • 罗乾林
    2020-01-03
    参考 istream_line_reader 实现的,望老师斧正

    template<typename _InIt, typename _Fun>
    class filter_view {
    public:
        class iterator { // 实现 InputIterator
        public:

            using iterator_category = input_iterator_tag;
            using value_type = typename _InIt::value_type;
            using difference_type = typename _InIt::difference_type;
            using pointer = typename _InIt::pointer;
            using reference = value_type&;

            iterator(_InIt _First, _InIt _Last, _Fun f)
                :_First(_First), _Last(_Last), _fun(f) {
                ++(*this);
            }

            reference operator*() const noexcept { return *_Cur; }
            
            pointer operator->() const noexcept { return &(*_Cur); }

            iterator& operator++() {
                while (_First != _Last && !_fun(*_First)) {
                    _First++;
                }
                _Cur = _First;
                if (_First != _Last) {
                    _First++;
                }
                return *this;
            }

            iterator operator++(int) {
                iterator temp(*this);
                ++(*this);
                return temp;
            }

            bool operator==(const iterator& rhs)
                const noexcept
            {
                return _Cur == rhs._Cur;
            }
            bool operator!=(const iterator& rhs)
                const noexcept
            {
                return !operator==(rhs);
            }
        private:
            _InIt _First;
            _InIt _Last;
            _InIt _Cur;
            _Fun _fun;

        };

        filter_view(_InIt _First, _InIt _Last, _Fun f)
            :_First(_First), _Last(_Last), _fun(f) {

        }

        iterator begin() const noexcept {
            return iterator(_First, _Last, _fun);
        }

        iterator end() const noexcept {
            return iterator(_Last, _Last, _fun);
        }
    private:
        _InIt _First;
        _InIt _Last;
        _Fun _fun;
    };
    展开

    作者回复: OK,没啥大问题。

    代码风格要稍微说明一下。你似乎是模拟了库代码的风格,这还是有点风险的。在一般的用户代码里,不应该出现双下划线打头、或者下划线加大写字母打头的标识符——这是给系统保留的。

    详见:

    https://zh.cppreference.com/w/cpp/language/identifiers

     2
     3
  • 微风漂过
    2020-01-30
    istream_line_reader 的实现在哪里找?cppreference里面没有搜到。

    作者回复: 哦,这个是我写的,不是标准库里的。

    源代码在第 7 讲讲解了。

    https://github.com/adah1972/nvwa/blob/master/nvwa/istream_line_reader.h

     1
    
  • 三味
    2020-01-10
    关于这个y_combinator, 代码中有很多我不太理解的:
    1. 为什么lambda函数作为参数传递的时候,都是Fun&&?我实际测试直接用Fun,对于当前代码没什么问题,直接用Fun不好么?;
    2. 关于forward,题目中所有带有forward的地方,我都直接替换为不带forward的方式,编译和运行也没有什么问题。这里的forward作用究竟是怎样的?

    作者回复: 性能。不用引用,对于比较重(比如,有较多按值捕获)的函数对象,拷贝的开销就比较大了。用 Fun&& 和 std::forward,就是要把拷贝尽可能转变成移动。

    
    
  • 三味
    2020-01-09
    这一节是我耗时最长的一节。。因为来回翻阅迭代器那一节。。
    写了个std::copy(fv.begin(), fv.end(), std::ostream_iterator<int>(std::cout, " ")); 结果编译失败。。查了半天。。因为没定义pointer和reference类型。。
    还有就是,之前的章节看得不仔细,看别人答案觉得好奇怪,为什么一上来要++(*this)。。后来对比自己的实现,我是按照forward_iterator_tag来定义的,所以写法有些不同。代码比较长。。我还是贴一下,放到留言的留言中吧,不然太长了。自己测试没啥问题,不过不保证。。没问题。。

    作者回复: 功能看起来没啥问题。嗯,太长,所以贴到别的留言下去了,还是有点怪怪的。

    还是要提醒,在一般的用户代码里,不应该出现双下划线打头、或者下划线加大写字母打头的标识符——这是给系统保留的。

    详见:

    https://zh.cppreference.com/w/cpp/language/identifiers

    
    
  • じJRisenづジ
    2020-01-07
    #include <iostream>
    #include <chrono>
    #include <execution>
    #include <numeric>
    #include <vector> 老师怎么学习库知识? 提点思路

    作者回复: 跟学外语一样,基本诀窍就是多读多写。文档现在都很齐全的,但除了极少数天才式的人物,看了不用就会忘掉吧。而且,没真正用过,碰到一些坑,看了的理解都不一定正确。

    另外就是看书了。书比文档更有体系性,更适合完整的学习,需要投入整块的时间。标准库的书,应该就是 Nicolai Josuttis 的那本 The C++ Standard Library 第二版了。中文版刚查了一下,侯捷译,一千多页。

     1
    
  • 廖熊猫
    2020-01-03
    Y-Combinator主要用到了一个不动点理论,刘未鹏老师的《康托尔、哥德尔、图灵——永恒的金色对角线》这篇文章里面说的相对详细一些。玩过一段函数式...就只有haskell那段代码看懂了😂

    作者回复: Y Combinator 只是好玩展示一下,刺激一下大家的好奇心。要进一步了解,是需要看参考资料,或者其他中英文资料的。你说的这篇我之前没看过,内容也不错。

    
    
  • hello world
    2020-01-03
    请问老师,map和reduce.那是最新的语句吗?还是有第三方库?那个TBB?

    作者回复: map-reduce 是一种方法,已经有很久了。在 C++ 里的直接对应是 transform 和 accumulate。TBB 见参考资料 [7]。

    
    
我们在线,来聊聊吧