计算大于向量中数字的元素
Counting elements greater than a number in vector
我想计算 C++ 向量中大于某个数字的元素的数量。阈值由用户输入。
计算大于数字的元素的代码如下:
ctr=count_if(v.begin(),v.end(), greater1);
对应函数:
bool greater1(int value)
{
return value >= 8;
}
问题是我只能在 count_if
函数调用之前知道阈值(此处为 8),因此我需要将阈值 t
作为参数传递。如何建立相同?
N.B。仅适用于 c++11 标准
最简单的方法是使用 lambda expression。使用它,您可以在 count_if
的调用站点中构建一个仿函数(称为闭包对象),并且您可以在 lambda 的主体中使用您当时知道的内容。那会给你留下类似
的东西
auto minimum_value = /* something that gets the minimum value you want to use for the comparison */
auto count = std::count_if(v.begin(), v.end(),[&](auto const& val){ return val >= minimum_value; });
// ^ use this to capture a reference of minimum_value
像一样,我们需要"capture"内部使用的阈值。 lambda 可以做到这一点,但如何做到这一点?
当你写一个 lambda 时
int threshold = 8;
std::count_if(/*...*/, [threshold](int next_val){return next_val >= threshold;});
在 C++11 及更高版本中,编译器使用此 lambda 语法生成一个轻量级 class 公开函数调用运算符,如下所示:
struct my_greater_equal
{
explicit my_greater_equal(int _threshold) : threshold(_threshold){}
bool operator()(int next_val) const
{
return next_val >= threshold;
}
int threshold;
};
(这只是 大部分 像 lambda 的样子)
然后在count_if
as-if中创建并使用实例:
std::count_if(my_collection.cbegin(), my_collection.cend(), my_greater_equal{8});
在内部,std::count_if
为您集合中的每个元素调用 my_greater_equal::operator()
。
Pre-C++11 我们必须手动创建这些轻量级 函数对象 (有时称为 functors,即使那不是技术上正确)
现在事情容易多了:-)
做一个给你阈值函数的函数!
auto above(int threshold) {
// This captures a copy of threshold
return [=](int value) {
return value >= threshold;
};
};
然后您可以使用 above
获取计数,只需将阈值作为参数传递即可:
auto count = count_if(v.begin(), v.end(), above(8));
我想计算 C++ 向量中大于某个数字的元素的数量。阈值由用户输入。
计算大于数字的元素的代码如下:
ctr=count_if(v.begin(),v.end(), greater1);
对应函数:
bool greater1(int value)
{
return value >= 8;
}
问题是我只能在 count_if
函数调用之前知道阈值(此处为 8),因此我需要将阈值 t
作为参数传递。如何建立相同?
N.B。仅适用于 c++11 标准
最简单的方法是使用 lambda expression。使用它,您可以在 count_if
的调用站点中构建一个仿函数(称为闭包对象),并且您可以在 lambda 的主体中使用您当时知道的内容。那会给你留下类似
auto minimum_value = /* something that gets the minimum value you want to use for the comparison */
auto count = std::count_if(v.begin(), v.end(),[&](auto const& val){ return val >= minimum_value; });
// ^ use this to capture a reference of minimum_value
像
当你写一个 lambda 时
int threshold = 8;
std::count_if(/*...*/, [threshold](int next_val){return next_val >= threshold;});
在 C++11 及更高版本中,编译器使用此 lambda 语法生成一个轻量级 class 公开函数调用运算符,如下所示:
struct my_greater_equal
{
explicit my_greater_equal(int _threshold) : threshold(_threshold){}
bool operator()(int next_val) const
{
return next_val >= threshold;
}
int threshold;
};
(这只是 大部分 像 lambda 的样子)
然后在count_if
as-if中创建并使用实例:
std::count_if(my_collection.cbegin(), my_collection.cend(), my_greater_equal{8});
在内部,std::count_if
为您集合中的每个元素调用 my_greater_equal::operator()
。
Pre-C++11 我们必须手动创建这些轻量级 函数对象 (有时称为 functors,即使那不是技术上正确)
现在事情容易多了:-)
做一个给你阈值函数的函数!
auto above(int threshold) {
// This captures a copy of threshold
return [=](int value) {
return value >= threshold;
};
};
然后您可以使用 above
获取计数,只需将阈值作为参数传递即可:
auto count = count_if(v.begin(), v.end(), above(8));