📄 sort1.txt
字号:
经过一段时间郁闷后,今天终于把sort的用法弄清楚了!顺便在这里总结一下,这样也可以帮助还在为sort发愁的朋友!:)
通过查找帮助文档,我们可以发现sort在algorithm头文件中是这样定义的: template<class RandomAccessIterator>
void sort(
RandomAccessIterator _First,
RandomAccessIterator _Last
);
template<class RandomAccessIterator, class Pr>
void sort(
RandomAccessIterator _First,
RandomAccessIterator _Last,
BinaryPredicate _Comp
);
从以上定义中我们可以发现sort是一个模板函数,而且只能用于内容可随机访问的元素类型,如:数组、向量等。而且我们可以发现第一个类型的sort函数接受两个迭代器,而第二个类型的sort函数除了接受连个迭代器外,还接受一个函数对象,这个函数对象是用来比较前面由迭代器所引用到的值得大小,这样来确定排列顺序的。
如果我们定义了一个整形或字符串类型向量的话,且我们想对其中元素排序的话,那么我们就可以利用第一种类型的sort函数。eg:
vector<int> intVector;
vector<int>::iterator first;
vector<int>::iterator last;
intVector.push_back(7);
intVector.push_back(2);
....
first = intVector.begin();
last = intVector.end();
sort(first, last);
当然以上只是简单类型,所以我们无须使用第二种类型的sort函数。(注意如果我们对字符串排序时,系统默认使用的“<”排序方法不符我们要求时,我们就需要使用第二种类型的sort函数了,而且需要定义自己的函数对象)
但是如果我们在向量中存储了结构体或对象时,如果我们还需对这些元素使用sort方法,我们该如何使用呢?这里举一个例子:
typedef struct{
string sdName; // student name
int ssn; // social security number
}sdstruct;
// 构建一个符合我们要求的函数对象
class Compare
{
public:
// 注意下面的const一定不能少
bool operator() (const sdstruct& sd1, const sdstruct& sd2)
{
if (sd1.sdName < sd2.sdName)
{
return true;
}
else
{
return false;
}
}
};
vector<sdstruct> sdVector;
vector<sdstruct>::iterator first;
vector<sdstruct>::iterator last;
sdstruct sd;
sd.sdName = "张三丰";
sd.ssn = 1234;
sdVector.push_back(sd);
sd.sdName = "周不通";
sd.ssn = 2345;
sdVector.push_back(sd);
...
// 这时我们就可利用以下方法对sdVector中的元素进行排序了
first = sdVector.begin();
last = sdVector.end();
sort(first, last, Compare()); // 注意这里的Compare()为一个匿名的类对象
// 目的是为了构建一个函数对象
好了到此已经介绍完了!希望大家以后能对sort不再有恐惧感!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -