Part4:算法(一)

来源:互联网 发布:淘宝怎么联系卖家售后 编辑:程序博客网 时间:2024/05/16 09:18
  • Rule30:如何使用插入迭代器
    原标题是“确保目标区间足够大”,我觉得这一部分主要讲了插入元素到容器中遇到的问题。所有,更换一个更能理解的名称。
    首先这个需求:
int trans(int value){    return value*2;}int _tmain(int argc, _TCHAR* argv[]){    int a[5] = {1,2,3,4,5};    list<int> values(a,a+5);    list<int> results;    transform(values.begin(),values.end(),results.end(),trans);

代码的本意是想将list values的值全部转化一遍后,插入到result的后面。但是,这个程序在运行时会报错。transform会把trans应用于values[0]并把结果赋给result.end();然后他会把trans应用于values[1]并把结果赋给(result.end()+1)。那会出现错误,因为在* result.end()处没有对象内存,*(result.end()+1)也没有。

我们可以使用back_insert达到这个条件,在内部,back_inserter返回的迭代器会调用push_back。所以你可以在任何提供push_back的容器上使用back_inserter。如果你想让一个算法在容器的前端插入元素,你可以使用front_inserter。在内部front_inserter利用了push_front,所以front_inserter只和提供那个成员函数的容器配合,就是deque和list。
但是front_inserter最后导致元素的顺序与values的对应顺序相反,如果你要trans把输出的结果放在results的前端,你也想要输出和values相同的顺序,你想要以相反的顺序迭代values。
如下:

transform(values.rbegin(),values.rend(),front_inserter(results),trans);

而inserter允许你强制算法把他们的结果插入容器中的任意位置。
有时我们可以先使用reverse来避免vector容器的内存的重新分配。

到目前为止,我们都是把结果作为新元素插入容器中。有时候你要覆盖现有容器的元素,这种情况下,你不需要插入迭代器,但是你需要保证results至少有和values一样多的元素,如果没有?你是使用reverse还是resize呢???呵呵,答案是,resize,记得了吧,resize会将增加的内存区域直接填充默认对象。

Rule31:排序的时候你的选择
首先回顾下sort排序的使用方式:

class Student{public: int no; int score; Student(int no,int score) {     this->no = no;     this->score = score; }};bool compare(Student&lhs,Student& rhs) {    return lhs.no<rhs.no;}main函数:vector<Student> students;students.push_back(Student(1,20));students.push_back(Student(3,20));students.push_back(Student(2,20));sort(students.begin(),students.end(),compare);for (vector<Student>::iterator it = students.begin();it!=students.end();it++)    {        cout<<it->no<<" ";    }

sort第三个参数是指定比较的算法,对于基本类型,可以使用默认情况,但是对于自定义类型,必须手动设置其比较函数。

partial_sort:部分排序,前面的n个元素有序,后面的数据无序。

nth_element:选择出前n的元素,这n个元素没有特定的顺序

random_shuffle(values.begin(),values.end());这个方法可以打乱元素的顺序。

partial_sort是不稳定的,nth_element,sort也没有提供稳定性。如果你排序的时候需要稳定性,你可以需要使用stable_sort。

nth_element除了能帮你找到区间顶部的n个元素,它也可以用于找到区间的中值或者找到在指定百分点的元素。

//会是有序的vector的中间goalPosition = begin + widgets.size() / 2;  nth_element(begin, goalPosition, end,qualityCompare);   

有时你需要的是选出大于某个值或是小于某个值的所有元素,而不是top-n元素,n的个数你并不知道,所有用partial_sort,nth_element不能达到你的需求。此时,我们需要使用partition算法,他重排区间中的元素以满足这个条件。

bool isLess20(int n){    if (n<20)    {        return true;    }    else        return false;}vector<int>::iterator partitionEnd = partition(values.begin(),values.end(),isLess20);    for (vector<int>::iterator it = values.begin();it!=partitionEnd;it++)    {        cout<<*it<<" ";    }
0 0
原创粉丝点击