1、使用sort()函数,需要头文件 <algorithm>,且默认升序排序,用户可自定义cmp实现降序排序。
演示如下:
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(const int& a, const int& b) {
return a > b;
}
void Print_Array(int* a, int n) {
for (int i = 0; i < n; ++i)
cout << '\t' << a[i] << " ";
cout << endl;
}
int main() {
//使用硬编码方式生成小数组数据,并输出原数组数据
const int SIZE = 10;
int a[SIZE] = { 1,3,5,7,9,2,4,6,8,10 };
Print_Array(a, SIZE);
//STL排序,默认为升序,"<=",并输出排序后数组
sort(a, a + SIZE);
Print_Array(a, SIZE);
//STL排序,自定义为降序,">=",并输出排序后数组
sort(a, a + SIZE,cmp);
Print_Array(a, SIZE);
return 0;
}
2、
upper_bound();
lower_bound()::在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置
举例如下:
一个数组number序列为:4,10,11,30,69,70,96,100.设要插入数字3,9,111.pos为要插入的位置的下标
则
pos = lower_bound( number, number + 8, 3) - number,pos = 0.即number数组的下标为0的位置。
pos = lower_bound( number, number + 8, 9) - number, pos = 1,即number数组的下标为1的位置(即10所在的位置)。
pos = lower_bound( number, number + 8, 111) - number, pos = 8,即number数组的下标为8的位置(但下标上限为7,所以返回最后一个元素的下一个元素)。
所以,要记住:函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置,且last的位置是越界的!!~
返回查找元素的第一个可安插位置,也就是“元素值>=查找值”的第一个元素的位置
测试代码如下:
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
int main()
{
const int VECTOR_SIZE = 8 ;
// Define a template class vector of int
typedef vector<int > IntVector ;
//Define an iterator for template class vector of strings
typedef IntVector::iterator IntVectorIt ;
IntVector Numbers(VECTOR_SIZE) ;
IntVectorIt start, end, it, location ;
// Initialize vector Numbers
Numbers[0] = 4 ;
Numbers[1] = 10;
Numbers[2] = 11 ;
Numbers[3] = 30 ;
Numbers[4] = 69 ;
Numbers[5] = 70 ;
Numbers[6] = 96 ;
Numbers[7] = 100;
start = Numbers.begin() ; // location of first
// element of Numbers
end = Numbers.end() ; // one past the location
// last element of Numbers
// print content of Numbers
cout << "Numbers { " ;
for(it = start; it != end; it++)
cout << *it << " " ;
cout << " }\n" << endl ;
// return the first location at which 10 can be inserted
// in Numbers
location = lower_bound(start, end, 1) ;
cout << "First location element 10 can be inserted in Numbers is: "
<< location - start<< endl ;
}
3、集合与映射
set::
set<int>
每个元素最多出现一次,与sort一样自定义类型也可以构造set,但同样必须定义 小于 这个运算符
set˙中默认由小到大排好序
map::
map<int ,int > 例如:m[5] = 7;
set头文件中的set和map分别是集合与映射。二者都支持insert、find、count、remove、操作,并且可以按照由小到大的顺序循环遍历其中的元素。map还提供了‘ [] ’ 运算符,使得map可以像数组一样使用
4、优先队列
默认是最大堆
头文件#include<queue>
用priority_queue<int> q; 声明
越小整数优先级越低的优先队列,出队元素不一定是最先入队的元素
取得队首元素操作top();
入队push();
出队pop();
要实现一个个位数大的整数优先级反而小,的优先队列,可以定义一个结构体cmp ,重载运算符“()”,
然后用priority_queue<int,vector<int>,cmp> q;声明
struct cmp{
bool operator () (const int a,const int b){
return a>b;
}
};
5、下一个排列
在头文件algorithm中 函数 next_permutation提供求下一个排列
#include <iostream>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std;
int main(){
int n,p[10];
cin >> n;
for(int i=0;i<n;i++){
cin >> p[i];
}
sort(p,p+n);
do{
for(int i=0;i<n;i++)
cout << p[i] << ' ';
cout << endl;
}while(next_permutation(p,p+n));
return 0;
}
需要注意的是,上述代码同样适用于可重集
枚举排列的常见方法有俩种:一种是递归枚举,另一种是用STL中的next_permutation