问题描述
以下是我的代码:
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_if
和set::find
。
C ++ 20我正在使用std::ranges::find_if
和set::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");
}
,
这是一个布尔函数,它在一组 s
中查找元素 pbool 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;
}