如何编写基于单元素find的数组多元素批量查找函数?
实现基于单个元素find的批量查找功能
嘿,我来帮你搞定这个批量查找的函数实现!你已经有了判断单个元素是否存在的find函数,现在要扩展成批量检查——所有传入元素都存在才返回true,否则返回false对吧?下面给你几种高效的实现方案,比用std::deque存结果再判断要更简洁高效:
方案1:C++17 折叠表达式(最推荐)
C++17引入的折叠表达式可以直接把参数包展开成逻辑与操作,而且支持短路求值——一旦某个元素查找失败,后面的检查会直接终止,性能拉满:
template <typename T> template <typename... Args> bool Vector<T>::find(const Args&... args) const { // 折叠表达式展开为:find(arg1) && find(arg2) && ... && find(argN) return (... && this->find(args)); }
如果需要确保传入的参数能隐式转换为T类型(避免类型不匹配的问题),可以用C++20的std::convertible_to约束:
#include <concepts> template <typename T> template <std::convertible_to<T>... Args> bool Vector<T>::find(const Args&... args) const { return (... && this->find(static_cast<const T&>(args))); }
方案2:C++11/14 递归参数包展开
如果你的项目还在用C++17之前的标准,可以用递归的方式逐个检查参数,同样支持短路求值:
template <typename T> template <typename... Args> bool Vector<T>::find(const Args&... args) const { // 辅助递归lambda,处理参数包展开 auto check_all = [this](const auto& first, const auto&... rest) { // 先检查第一个元素,不存在直接返回false if (!this->find(first)) { return false; } // 递归终止条件:没有剩余参数时返回true if constexpr (sizeof...(rest) == 0) { return true; } else { // 递归检查剩余参数 return check_all(rest...); } }; // 处理空参数的情况(可根据需求调整,比如返回false) if constexpr (sizeof...(args) == 0) { return true; } else { return check_all(args...); } }
补充:完善你原来的deque思路
如果你坚持想用std::deque来实现,也可以补全代码,但这种方式会遍历所有参数(哪怕前面已经有元素不存在),还会额外占用容器内存,效率不如上面两种:
template <typename T> template <typename... Args> bool Vector<T>::find(const Args&... args) const { std::deque<bool> findDeque; // 展开参数包,逐个调用find并将结果存入deque (findDeque.push_back(this->find(args)), ...); // 遍历检查所有结果是否为true for (bool found : findDeque) { if (!found) { return false; } } return true; }
注意点
- 确保你的单个元素
find函数签名是bool Vector<T>::find(const T& elem) const,这样参数包展开时能正确调用。 - 如果允许传入0个参数,记得根据需求处理返回值(比如返回
true或者false)。
内容的提问来源于stack exchange,提问作者Jonny0201
相关产品推荐
相关产品推荐

