C++中的等价,相等与自定义比较
英文好的同学可以看这篇文章 链接
先看这样一段代码
std::vector< std::pair<int, std::string> > v1 = ... // v1 is filled with data
std::vector< std::pair<int, std::string> > v2 = ... // v2 is filled with data
std::vector< std::pair<int, std::string> > results;
std::sort(v1.begin(), v1.end());
std::sort(v2.begin(), v2.end());
std::set_difference(v1.begin(), v1.end(),
v2.begin(), v2.end(),
std::back_inserter(result),
compareFirst);
很显然,这里我们传入了一个自定义比较函数,希望通过这个函数帮助我们完成set_diff
默认情况下比较pair会比较他的两个元素,这里我们只想比较第一个,所以我们在这里尝试给出了自己的比较函数
在此之前,注意,set_difference
期望我们传入的输入是排好序的,如果使用在sort中的排序函数和set_difference的比较函数不同的话,至少要保证set_difference中元素的顺序是按照比较函数的顺序来的。
比如在这个例子中,我们使用的排序函数是先排第一个元素,再排第二个元素,但是我们比较只比较了第一个元素,这也是可以的,因为这个顺序本身就是也满足按照第一个元素排序的情况的
我们可能实现的比较函数是这样的
bool compareFirst(const std::pair<int, std::string>& p1, const std::pair<int, std::string>& p2)
{
return p1.first == p2.first; // not final code, bug lurking here!
}
虽然看起来很正常,但是答案是错误的,为什么呢?
我们将STL分为两个部分,对元素排序的和不对元素排序的
对元素排序的容器,比如有map, set
对元素排序的算法,比如set_difference, binary_search
不对元素排序的容器,比如vector, queue
不对元素排序的算法,比如find, count
在C++中有两种方式表达a等于b
第一种是 a==b
这个叫相等(equality),对应C++中的operator==
第二种是 !(a < b) && !(b < a)
这个叫等价(equivalence),对应C++中operator<
而在stl中,对于排序的容器或算法来说,需要使用operator<
的方法,而不排序的部分则没有这个限制
所以对于我们实现的自定义比较函数来说,要使用等价的方法
bool compareFirst(const std::pair<int, std::string>& p1, const std::pair<int, std::string>& p2)
{
return p1.first < p2.first; // correct, STL-compatible code.
}
文章评论