c – 迭代包含在两个范围的交集中的对象

标准库中是否有某些东西允许我迭代包含在两个范围的交集中的对象?

特别是,给定一个函数对象动作,我想获得一个相当于的程序

/* some container supporting a push_back operation */ intersection;
std::set_intersection(first1, last1, first2, last2,
    std::back_inserter(intersection));
for (auto const& element : intersection)
    action(element);

无需插入交叉点.当然,例如,编写这样的代码很容易

template<class InputIt1, class InputIt2, class UnaryFunction>
void for_each_in_intersection(InputIt1 first1, InputIt1 last1,
    InputIt2 first2, InputIt2 last2, UnaryFunction f)
{
    while (first1 != last1 && first2 != last2)
    {
        if (*first1 < *first2)
            ++first1;
        else
        {
            if (!(*first2 < *first1))
                f(*first1++);
            ++first2;
        }
    }
}

但我希望标准库中已有可用的东西.

解决方法:

您可以使用来自boost的Function Output Iterator

#include <boost/function_output_iterator.hpp>
#include <vector>
#include <iostream>
#include <algorithm>

int main() {
    std::vector<int> v1 = {1, 2, 3, 4, 5};
    std::vector<int> v2 = {2, 4};
    std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(),
            boost::make_function_output_iterator([](int i) {
                std::cout << i * i << '\n';
            }));
}
上一篇:c – 如何最有效地插入对列表?


下一篇:c – vector>使用初始化列表