特殊的 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);
}