? ? sort函数是基于快速排序实现的,属于不稳定排序。
? ??只支持3种容器:array、vector、deque。
? ? 如果容器中存储的是自定义的对象,则该类必须提供移动构造函数和移动赋值运算符。
? ? 代码示例:
class AA
{
int* m_pValue;
public:
AA(int v) :m_pValue(new int(v)) {}
//拷贝构造函数
AA(const AA& other) {
if (0 != other.m_pValue) {
this->m_pValue = new int(*other.m_pValue);
}
else {
this->m_pValue = 0;
}
}
//析构函数
~AA() {
delete m_pValue;
}
//移动构造函数
AA(AA&& other) noexcept : m_pValue(other.m_pValue) {
other.m_pValue = 0;
}
//移动赋值操作符
AA& operator = (AA&& other) noexcept {
if (this != &other) {
delete m_pValue;
m_pValue = other.m_pValue;
other.m_pValue = 0;
}
return *this;
}
//比较操作符
bool operator < (AA& other) {
if (0 != this->m_pValue && 0 != other.m_pValue) {
return *this->m_pValue < *other.m_pValue;
}
return false;
}
void Print() {
if (0 != this->m_pValue) {
cout << *this->m_pValue << " ";
}
else {
cout << "null" << " ";
}
}
};
int main() {
std::vector<AA> v1{ 5,6,9,8,3,2,1,4 };
for_each(v1.begin(), v1.end(), mem_fun_ref(&AA::Print));
cout << endl;
sort(v1.begin(), v1.end());
for_each(v1.begin(), v1.end(), mem_fun_ref(&AA::Print));
return 0;
}
? ??stable_sort函数是基于归并排序实现的,属于稳定排序。用法和sort一样。
? ? 代码示例:
void printInt(int val)
{
cout << val << " ";
}
int main() {
std::vector<int> v1{ 3,2,5,4,1,6,9,8 };
for_each(v1.begin(), v1.end(), printInt);
cout << endl;
//将v1中最小的 3 个元素移动到开头位置并排好序
partial_sort(v1.begin(), v1.begin() + 3, v1.end());
for_each(v1.begin(), v1.end(), printInt);
return 0;
}
? ? 代码示例:
void printInt(int val)
{
cout << val << " ";
}
int main() {
int target[4] = { 0 };
std::vector<int> v1{ 3,2,5,4,1,6,9,8 };
//将v1中前面5个元素排序,然后拷贝3个元素到target
partial_sort_copy(v1.begin(), v1.begin() + 5, target, target + 3);
for_each(target, target + 4, printInt);
return 0;
}
? ? 找到[first, last)范围内按照排序规则(默认升序)位于第nth个位置处的元素,并将其放置到此位
? ? ?置。同时使所有比此元素小的元素在左侧,比它大的元素在右侧。
void printInt(int val)
{
cout << val << " ";
}
int main() {
std::vector<int> v1{ 8,1,3,4,5,6,0,2,7,9 };
//默认升序排序
nth_element(v1.begin(), v1.begin() + 2, v1.end());
cout << "nth_element排序" << endl;
for_each(v1.begin(), v1.end(), printInt);
return 0;
}
? ? ?根据用户自定义的筛选规则,重新排列指定区域内存储的数据,使其分为 2 组,第一组为符合
? ? ?筛选条件的数据,另一组为不符合筛选条件的数据。返回第二组的第一个元素。
? ? ?代码示例:
void printInt(int val)
{
cout << val << " ";
}
bool compare(int i) { return (i % 2) == 0; }
int main() {
std::vector<int> v1{ 1,2,3,4,5,6,7,8,9 };
auto bound = partition(v1.begin(), v1.end(), compare);//按奇偶分组
cout << "bound = " << *bound<<endl;
for_each(v1.begin(), v1.end(), printInt);
return 0;
}
? ? 保证对指定区域内数据完成分组的同时,不改变各组内元素的相对位置。用法和partition一样。
? ? 此函数专门用于判断某个序列是否为有序序列。
? ??代码示例:
bool compare(int i, int j) { return i > j; }
int main() {
std::vector<int> v1{ 9, 8, 7, 6, 2 };
cout << "v1 is sorted? " << is_sorted(v1.begin(), v1.end(), compare) << endl;
return 0;
}