sort() 函数有 2 种用法,其语法格式分别为:
1.//对 [first, last) 区域内的元素做默认的升序排序 void sort (RandomAccessIterator first, RandomAccessIterator last); 2.//按照指定的 comp 排序规则,对 [first, last) 区域内的元素进行排序 void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
另外,C++ 中的 struct 和 class 非常类似(有关两者区别,可阅读《C++ struct和class到底有什么区别》一文),前者也可以包含成员变量和成员函数。
今天学习了一下sort的函数的使用;然后就出现了一个问题。就是我用typedef把结构体定义成某个类型的时候,它会出现编译错误:
但是如果不加那个typedef, 它会正常运行;
struct {
bool operator()(int a, int b)
{
return a > b;
}
}mycmp1;
void test02()
{
int a[10] = {3,2,1,70,8,9,34,23,24,71};
sort(a,a+10);
print(a,10);
sort(a,a+10,mycmp1);
print(a,10);
}
但是如果是这样,又不能通过编译:
struct mycmp1{
bool operator()(int a, int b)
{
return a > b;
}
};
关于如何自定义一个排序规则,除了《C++ STL关联式容器自定义排序规则》一节介绍的 2 种方式外,还可以直接定义一个具有 2 个参数并返回 bool 类型值的函数作为排序规则。
#include <iostream> // std::cout
#include <algorithm> // std::sort
#include <vector> // std::vector
//以普通函数的方式实现自定义排序规则
bool mycomp(int i, int j) {
return (i < j);
}
//以函数对象的方式实现自定义排序规则
class mycomp2 {
public:
bool operator() (int i, int j) {
return (i < j);
}
};
int main() {
std::vector<int> myvector{ 32, 71, 12, 45, 26, 80, 53, 33 };
//调用第一种语法格式,对 32、71、12、45 进行排序
std::sort(myvector.begin(), myvector.begin() + 4); //(12 32 45 71) 26 80 53 33
//调用第二种语法格式,利用STL标准库提供的其它比较规则(比如 greater<T>)进行排序
std::sort(myvector.begin(), myvector.begin() + 4, std::greater<int>()); //(71 45 32 12) 26 80 53 33
//调用第二种语法格式,通过自定义比较规则进行排序
std::sort(myvector.begin(), myvector.end(), mycomp2());//12 26 32 33 45 53 71 80
//输出 myvector 容器中的元素
for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it) {
std::cout << *it << ' ';
}
return 0;
}
最后我又把那个结构体改成了类:按照第1种格式声明,它也不能通过编译。最后的原因如上呢:
就是把它当成函数来调用,但它的本质是一个对象。在把那个对象当参数的时候,要在对象后面加括号。这个就有点离谱。是关于STL那个容器的。 现在,终于搞清楚它的实质了; std::sort(myvector.begin(), myvector.end(), mycomp2()),mycomp2.operator();
所以这样就先告一段落了,这个使用我应该是会了,但是关于它的更底层的东西先放着吧,试考完以后再搞。