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

posted @ 2015-04-21 23:17  阿木木在发呆  阅读(242)  评论(0编辑  收藏  举报