boost::bind如何与std::greater和std::less_equal一起工作?
How does the boost::bind work with std::greater and std::less_equal
下面的代码用于计算满足以下条件的元素数量:
(i > 5) && (i <=10)
std::vector<int> ints;
..
int count=std::count_if(
ints.begin(),
ints.end(),
boost::bind( // # bind 1
std::logical_and<bool>(),
boost::bind(std::greater<int>(),_1,5), // # bind 2
boost::bind(std::less_equal<int>(),_1,10))); // # bind 3
template <class T> struct greater : binary_function <T,T,bool> {
bool operator() (const T& x, const T& y) const
{return x>y;}
};
我将上面的语句分解如下:
boost::bind(std::greater<int>(),_1,5)
用于i > 5
boost::bind(std::less_equal<int>(),_1,10)
用于i <=10
。
我的问题是如何理解上面的代码,因为如果我写代码,我会写以下内容:
boost::bind(std::greater<int>(),_2,5)
用于i > 5
boost::bind(std::less_equal<int>(),_2,10)
用于i <=10
。
函数std::greater
需要两个参数(即x
和y
),并确保x > y
。所以我认为我们需要将y
与5
绑定,这样我们就可以找到所有的Xs
。当然,我的想法是错误的。
占位符_1
、_2
等指定了特定(最内部)bind
调用返回的函子的参数,而不是您可能构建的完整表达式的参数。例如:
boost::bind(std::greater<int>(),_1,5)
…bind
返回一个函子,它将接收到的第一个形参作为第一个实参传递给greater<int>
函子。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 为什么 std::equal 模板由两个类参数化?
- std::具有用户定义类的equal函数
- 是 'char* p=0;std::equal(p,p,p)' 根据C++标准明确定义
- 在“abcd”和“abc”的情况下,“std::equal”是否取消引用“end()”
- 是否有一个安全的替代std::equal
- 为什么std::equal比两个小std::数组的手卷循环慢得多?
- std::hash 是否保证"equal"浮点数的哈希值相等?