令我恼火的是,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/