特殊的 back_inserter

题目描述

完善 MultBackInsertIter 类模板,使得其在作为第三个参数被 std::copy 调用时能够将元素 * 2 后插入到含有 push_back 成员函数的容器中。

关于输入

关于输出

见样例输出

参考答案

#include <iostream>
#include <vector>
#include <algorithm>
#include <deque>
#include <list>
using std::cout, std::endl;
template <typename Container>
class MultBackInsertIter {
private:
    Container* c;
public:
    // C++17 规定的迭代器必须定义的类型别名
    // C++20 只需 value_type 和 difference_type
    using value_type = typename Container::value_type;
    using reference = value_type&;
    using pointer = value_type*;
    using difference_type = std::ptrdiff_t;
    using iterator_category = std::output_iterator_tag;
    MultBackInsertIter(Container& c_): c{&c_} {}
    MultBackInsertIter& operator*() { return *this; }
    MultBackInsertIter& operator++() { return *this; }
    MultBackInsertIter& operator=(const typename Container::value_type& value) {
        c->push_back(value * 2);
        return *this;
    }
};
template <typename T>
void print(const T& c) {
    for (auto i: c) { cout << i << ' '; }
    cout << endl;
}
int main() {
    std::vector<int> v{1, 2, 3, 4, 5};
    std::deque<int> d{8, 9};
    std::list<int> l{10, 11};
    std::copy(v.begin(), v.end(), MultBackInsertIter(d));
    std::copy(v.begin(), v.end(), MultBackInsertIter(l));
    print(d);
    print(l);
}