c++ - 一个通用的 STLish contains()

标签 c++ algorithm stl containers idioms

令我恼火的是,STL 容器没有contains() 方法返回true 如果容器包含元素false 否则。所以,我坐下来写了这个:

template <typename C, typename E>
inline bool contains(const C& container, const E& element) {
    return container.find(element) != container.end();
}

对于集合和映射来说效果很好,但对于 vector 就不行了。或列表。我该如何进行?我应该再写一个吗

template <typename T>
inline bool contains(const vector<T>& container, const T& element) {
    std::find(vector.begin(), vector.end(), item) != vector.end()
}

以及其他容器的更具体代码?我是否应该选择迭代器的次优使用来逐个元素地检查?我真的宁愿不这样做...也许我没有注意到一些相关的 STL 功能?

最佳答案

我认为一个原因是缺少 std::contains返回 bool就是新手程序员太容易掉进陷阱了

if (std::contains(my_container, some_element)) {
   auto it = std::find(begin(my_container), end(my_container), some_element);
   // process *it
}

现在您完成了所需工作的两倍。

写起来很简单

auto it = std::find(begin(my_container), end(my_container), some_element);
if (it != end(my_container)) {
   // process *it
}

如果你坚持要一个contains函数,您可以通过返回 std::pair<bool, iterator> 来实现两全其美的目标或 std::optional<iterator> (出现在库基础技术规范中,或者已经出现在 Boost 中),您可以这样查询:

if (opt = std::contains(my_container, some_element)) {
   // process *opt 
}

关于c++ - 一个通用的 STLish contains(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26886577/

相关文章:

c++ - OpenCV SVM 训练数据

c++ - 指向模板接口(interface)的唯一指针

java - 三元算子用调车场算法解析

c++ - 没有元素满足谓词时的 is_partitioned 行为

algorithm - Ruffini 规则算法的复杂性(大 O)是多少

c++ - 什么时候必须使用初始化列表来初始化 C++ 类成员?

C++ QuickSort算法不断崩溃

c++ - 在拖动窗口或按住菜单按钮期间,如何阻止 Windows 阻止程序?

c++ - 使用数字序列有效地初始化 std::set

c++ - C++ 中 vector 的平方根和平方加倍