c++ - 是否可以使用 `std::set_intersection` 来检查两个集合是否有任何共同元素?

标签 c++ stl iterator set c++17

std::set_intersection允许我通过将元素输出到 输出迭代器 来检索两个 std::set 实例之间的所有共同元素。在我的特定情况下,我只对检查两个集合是否有任何共同元素感兴趣。

我目前的解决方案是使用 boost::function_output_iterator设置一个 bool 变量如下:

bool b{false};
set_intersection(begin(s0), end(s0),
                 begin(s1), end(s1),
                 make_function_output_iterator([&](const auto&){ b = true; }));
return b;

不幸的是,如果找到匹配项,此解决方案不会提前返回:必须完全遍历集合(即没有提前返回/短路)

是否可以将 set_intersection 用于提前返回? 我能想到的唯一解决方案是从 function_output_iterator 中抛出异常 函数对象,这是个糟糕的主意。

如果没有,标准库中是否还有其他可以帮助我的东西,或者我是否被迫重新实现 set_intersection?奖励问题:如果 set_intersection 的接口(interface)允许提前终止(即标准库算法可能具有的“最通用”接口(interface)是什么),它会是什么样子??

最佳答案

好吧,“被迫”重新实现 std::set_intersection 并不是一件坏事。 只有五行代码:

template <class I1, class I2>
bool have_common_element(I1 first1, I1 last1, I2 first2, I2 last2) {
    while (first1 != last1 && first2 != last2) {
        if (*first1 < *first2)
            ++first1;
        else if (*first2 < *first1)
            ++first2;
        else
            return true;
    }
    return false;
}

好的,超过 5 行。但是无痛。

关于c++ - 是否可以使用 `std::set_intersection` 来检查两个集合是否有任何共同元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46770028/

相关文章:

c++ - boost::spirit::karma:将 no_delimit 与替代项一起使用

c++ - 如何使用visual studio c++与ZIGBEE传输数据

c++ - 包装 STL 习惯用法以提高可读性是个好主意吗?

c++ - 从 STL 容器中移除一些东西而不解构它

java - 迭代列表时删除元素

c++ - 将 DirectX SDK 代码转换为新的 Windows 8.1 SDK 代码

c++ - 创建的事件数量有限制吗?

c++ - 如何将 hash_map 与 char* 一起使用并进行字符串比较?

c++ - 二维 vector 类成员的迭代器

iterator - 解决扩展特征的局限性