pair/sort/find/qsort
1. pair
template <class T1, class T2> struct pair { typedef T1 first_type; typedef T2 second_type; T1 first; T2 second; pair() : first(T1()), second(T2()) {} pair(const T1 & a, const T2 & b) : first(a), second(b) {} template <class U1, class U2> pair(const pair<u1, u2=""> & p) : first(p.first), second(p.second) {} };
pair()
默认构造函数,要求T1和T2有默认的构造函数,并同时使用二者默认构造函数来构造容器。
pair(const T1 & a, const T2 & b)
构造pair。容器的first和second元素,分别使用a和b进行构造。
我们要访问pair容器的值。只需要直接引用p.first,指代第一个元素;直接引用p.second,指代第二个元素。
最简单的赋值方法就是声明变量后,分别引用first和second对其赋值。
2. sort
sort函数的分类:
sort
对给定区间所有元素进行排序
stable_sort
对给定区间所有元素进行稳定排序
stable的函数可保证相等元素的原本相对次序在排序后保持不变。这里的相等,是指你提供的函数表示两个元素相等,并不一定是一摸一样的元素。
例如,如果你写一个比较函数:
bool
less_len(
const
string &str1,
const
string &str2)
{
return
str1.length() < str2.length();
}
此时,"apple" 和 "winter" 就是相等的,如果在"apple" 出现在"winter"前面,用带stable的函数排序后,他们的次序一定不变,如果你使用的是不带
"stable"的函数排序,那么排序完后,"Winter"有可能在"apple"的前面。
partial_sort
对给定区间所有元素部分排序
partial_sort_copy
对给定区间复制并排序
nth_element
找出给定区间的某个位置对应的元素
is_sorted
判断一个区间是否已经排好序
partition
使得符合某个条件的元素放在前面
qsort(void* base, size_t num, size_t width, int(*)compare(const void* elem1, const void* elem2)) 参数表 *base: 待排序的元素(数组,下标0起)。 num: 元素的数量。 width: 每个元素的内存空间大小(以字节为单位)。可用sizeof()测得。 int(*)compare: 指向一个比较函数。*elem1 *elem2: 指向待比较的数据。 比较函数的返回值 返回值是int类型,确定elem1与elem2的相对位置。 elem1在elem2右侧返回正数,elem1在elem2左侧返回负数。 控制返回值可以确定升序/降序。
一个升序排序的例程: int Compare(const void *elem1, const void *elem2) { return *((int *)(elem1)) - *((int *)(elem2)); } int a[10];
//赋值 qsort(a, 10, sizeof(int), Compare);
所有的sort算法的参数都需要输入一个范围,[begin, end)。这里使用的迭代器(iterator)都需是随机迭代器(RadomAccessIterator),
也就是说可以随机访问的迭代器,如:it+n什么的。(partition 和stable_partition 除外),如果你需要自己定义比较函数,你可以
把你定义好的仿函数(functor)作为参数传入。每种算法都支持传入比较函数。
系统自己为sort提供了less仿函数。在STL中还提供了其他仿函数,以下是仿函数列表:
equal_to
相等
not_equal_to
不相等
less
小于
greater
大于
less_equal
小于等于
greater_equal
大于等于
需要注意的是,这些函数不是都能适用于你的sort算法,如何选择,决定于你的应用。另外,不能直接写入仿函数的名字,而是要写其重载的()函数,
如greater<
int
>()
当你的容器中元素时一些标准类型(int float char)或者string时,你可以直接使用这些函数模板。但如果你时自己定义的类型或者你需要按照其他方式
排序,你可以有两种方法来达到效果:一种是自己写比较函数。另一种是重载类型的'<'操作赋。
3. find
find分类
find
find_first_of
find_if
adjacent_find