[英]C++ template function to check if a vector of contains the value?
我曾计划为所有类似于 FORTRAN 的类型实现一种 INDEX 函数。 这会是一个正确的解决方案吗? ** 评论后编辑 **
template <typename T>
bool contains(std::vector<T>& vec, T value){
if (std::any_of(vec.begin(), vec.end(), [value](T j) { return value == j; }))return true;
return false;
}
注意:泛型实现的浮点类型比较存在一个陷阱!
如果您的程序的目标是找到正确方法的确定值:
template <typename T>
bool index(std::vector<T>& vec, T value){
return std::any_of(vec.begin(), vec.end(), [value](T j) { return value == j; });
}
我的程序与@caleth 的答案没有太大区别,因为为了编写一个可以处理各种范围的通用函数,例如std::array
、 std::vector
、类C-like array
或其他,你应该写一个这样的模板:
template <typename iter, typename T>
bool any_index(iter begin, iter end, T value) {
for (; begin != end; ++begin) {
if (static_cast<T>(*begin) == value) {
return true;
}
}
return false;
}
用法:
int main() {
vector<int> v1{ 4, 3, 2, 1 };
vector<string> v2{ "hey", "language", "compiler", "bug" };
vector<char> v3{ 'a', 'b','c', 'd' };
array<int, 6> c{ {1,2,3,4,5,6} };
unsigned char buf[5] = {0x11, 0x22, 0x33, 0x44, 0x55};
assert(any_index(begin(v1), end(v1), 4) == true);
assert(any_index(begin(v2), end(v2), string("compiler")) == true);
assert(any_index(begin(v3), end(v3), 'd') == true);
assert(any_index(begin(c), end(c), 5) == true);
assert(any_index(begin(buf), end(buf), 0x11) == true);
return 0;
}
完整示例( godbolt )
是的,这是一个有效的实现,但是我会写不同的
template <std::ranges::input_range R, typename T>
requires std::indirect_binary_predicate<ranges::equal_to, ranges::iterator_t<R>, const T*>
bool index(R&& range, const T & value){
return std::ranges::find(range, value) != std::ranges::end(range);
}
这适用于任何序列和任何可以与该序列元素进行相等性比较的值。
在 C++11 中,没有关于要求的明确概念,但情况类似
template <typename R, typename T>
bool index(R&& range, const T& value) {
using std::begin, std::end;
return std::find(begin(range), end(range), value) != end(range);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.