如何在C ++中的一组集合中查找元素?

问题描述

以下是我的代码

set<set<int,greater<int>>> output;
set<int,greater<int>> k;

k.insert(5);
output.insert(k);

现在如何确定元素5是否存在于我的“输出”集中?

如何在“输出”集中找到元素5属于哪个集合?

解决方法

使用简单的for循环:

size_t ii = 0;
for (const auto& inner : output) {
    if (inner.count(5))
        std::cout << "found in set " << ii << std::endl;
    ++ii;
}
,

有一个C ++ 20之前的版本和一个C ++ 20(使用范围)解决方案

C ++ 20之前的版本,我正在使用std::find_ifset::find。 C ++ 20我正在使用std::ranges::find_ifset::contains。 对于C ++ 20,我还使用std::optional std::reference_wrapper返回类型。还有概念,所以这是适用于所有集合和地图的通用解决方案。

#include <set>
#include <algorithm>

template<typename T,typename Comp = std::less<T>>
std::set<T,Comp> const* findInSetOfSets(std::set<std::set<T,Comp>> const& setOfSets,T const& value) {
    auto const it = std::find_if(cbegin(setOfSets),cend(setOfSets),[&](std::set<T,Comp> const& set) { return set.find(value) != end(set); } );
    if (it != cend(setOfSets)) return &*it;
    return nullptr;
}

#include <optional>
#include <functional>
#include <type_traits>

template<typename T,typename U>
concept hasContains = requires(T& t,U& u) {
    { t.contains(u) } -> std::same_as<bool>;
};

template<std::ranges::input_range R,typename T,typename U = std::remove_reference<R>::type::value_type>
    requires hasContains<U,T>
[[nodiscard]] auto findCpp20(R&& r,T const& value) noexcept
 ->std::optional<std::reference_wrapper<U const>> {
    auto it = std::ranges::find_if(r,[&](U const& u) { return u.contains(value); } );
    if (it != std::ranges::end(r)) return *it;
    return std::nullopt;
}

#include <cstdio>

int main(){
    std::set<std::set<int,std::greater<int>>> output;
    std::set<int,std::greater<int>> k;

    k.insert(5);
    output.insert(k);

    auto setPtr = findInSetOfSets(output,5);
    if (setPtr != nullptr) printf("set found!\n");
    auto optionalSet = findCpp20(output,5);
    if (optionalSet.has_value()) printf("set found!\n");
}

godbolt

,

这是一个布尔函数,它在一组 s

中查找元素 p
bool findelem(int p,set<set<int>> const& s) 
{
    for (auto itr1= s.cbegin(); itr1 != s.cend(); ++itr1) {
        for (auto itr2 = itr1->cbegin(); itr2 != itr1->cend(); ++itr2) {
            if (*itr2==p) {
                return true;
            }
        }
    }
    return false;
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...