我写了一个矢量比较函数。
textView.setText(Html.fromHtml("<b>S</b>tudent <b>L</b>ogin"));
输出:
#include <vector>
#include <iostream>
#include <algorithm>
using std::vector;
using std::cout;
bool mycomp(const vector<int>& vi_a, const vector<int>& vi_b){
for(auto x:vi_a) cout << x;
cout << '\n';
return true;
}
int main(){
vector<int> vi1{2,9,8};
vector<int> vi2{3,5,6};
vector<int> vi = min(vi1, vi2, mycomp);
for(auto x:vi) cout << x;
cout << '\n';
}
奇怪的是输出是356
356
,而不是356
。调用298
时,似乎切换了两个向量。
P.S。我不想在这里使用lambda,因为mycomp
包含多行代码,这种方式更具可读性。
答案 0 :(得分:5)
如果您查看cppreference documentation for std::min()
,您将在可能的实现中看到第二个元素被用作比较器中的第一个元素。
template<class T, class Compare>
const T& min(const T& a, const T& b, Compare comp)
{
return (comp(b, a)) ? b : a;
}
当您使用参数min()
和vi2
调用vi1
时,第二个参数将传递给比较器(在您的情况下为vi2
),比较器返回true(暗示vi2
是两者中的最小值)。在执行此操作时,比较器还打印出356
,因为根据上面的可能实现,这是传递给比较器的第一个元素。
在那之后你会把两个向量中较小的一个取出来,这是第一个根据上面可能的实现传递给比较器的向量(vi2
)。而你打印出来。因此,您再次获得356
。
请注意,b
作为std::min
的第一个参数传递的原因是因为在两个比较相等的情况下,需要返回a
算法。同时,只需要调用一次比较器。结合这两个要求可以实现上述可能的实现。