gpt4 book ai didi

c++ - 在容器中查找元素的标准化方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:46:21 25 4
gpt4 key购买 nike

是否有在容器中搜索值((unordered_)map 的键)的标准化方法?

这个函数的例子:

template <class T, class V> bool find(T const &t, V const &v) {
// For std::vector : return std::find(t.begin(), t.end(), v) != t.end();
// For std::(unordered_)set and (unordered_)map : return t.find(v) != t.end();
return ?
}

我用:

template <class T, class V> bool find(T const &t, V const &v) {
return std::find(t.begin(), t.end(), v) != t.end();
}

template <class V> bool find(std::set<V> const &t, V const &v) {
return t.find(v) != t.end();
}

template <class V> bool find(std::unordered_set<V> const &t, V const &v) {
return t.find(v) != t.end();
}

template <class K, class V> bool find(std::map<K, V> const &t, K const &v) {
return t.find(v) != t.end();
}

template <class K, class V> bool find(std::unordered_map<K, V> const &t, K const &v) {
return t.find(v) != t.end();
}

但是 std 有这种东西吗?

最佳答案

没有什么标准可以为您执行此操作 - 但我们可以轻松编写这样的解决方案。 “特殊”部分是容器是否具有 find() 成员函数。如果是这样,我们应该使用它。如果没有,我们回退到使用 std::find()。无论如何,我们要将结果与 end() 进行比较。

因此我们为 .find() 编写了一个首选重载,为另一个编写了一个回退重载:

template <class C, class V>
auto generic_find_impl(C const& container, V const& value, int /* unused */)
-> decltype(container.find(value))
{
return container.find(value);
}

template <class C, class V>
auto generic_find_impl(C const& container, V const& value, ...)
{
using std::begin;
using std::end;
return std::find(begin(container), end(container), value);
}

template <class C, class V>
bool generic_find(C const& container, V const& value) {
using std::end;
return generic_find_impl(container, value, 0) != end(container);
}

如果 container.find(value) 是一个有效的表达式,由于最后一个参数,第一个重载将是首选(int 更适合 0...)。如果它不是一个有效的表达式,那么第一个重载是不可行的,我们只会得到第二个重载。

关于c++ - 在容器中查找元素的标准化方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37631993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com