如何编写自己的函数进行比较?

时间:2017-07-05 06:07:41

标签: c++

我写了一个矢量比较函数。

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包含多行代码,这种方式更具可读性。

1 个答案:

答案 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算法。同时,只需要调用一次比较器。结合这两个要求可以实现上述可能的实现。