Lambda作为OutputIterator

时间:2015-10-13 20:34:12

标签: c++ c++11

我来自Java世界并且对C ++没有太多经验,因此出现了以下问题。我看到OutputIterator被广泛使用。到目前为止我所看到的是人们使用插入器,例如std::back_inserter

是否不可能以某种方式提供为每个元素调用的lambda而不是在容器中记录元素?

实施例

而不是

std::vector<int> my_vector;
set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), std::back_inserter(my_vector));

类似

set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), to_iterator([](int x) {
    std::cout << x;
}));

2 个答案:

答案 0 :(得分:11)

Boost为此目的function_output_iterator

<强> Live On Coliru

#include <boost/function_output_iterator.hpp>
#include <iostream>
#include <set>

int main() {
    std::set<int> s1{ 1, 2, 3 }, s2{ 3, 4, 5 };
    set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(),
                     boost::make_function_output_iterator([](int x) { std::cout << x; }));
}

打印:

3

写一个简单的版本应该不会太难(虽然我更喜欢自己使用boost::iterator_facade<>所以你仍然会被提升所困扰)

答案 1 :(得分:2)

  

是否不可能以某种方式提供为每个元素调用的lambda而不是在容器中记录元素?

lambda本身不足以作为std::set_intersection的参数。您需要将它包装在支持requirements of an OutputIterator的辅助类(仿函数)中。

OutputIterator必须支持的关键操作符是*iteriter++++iter