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<<" "; }
- Part4:算法(一)
- Part4:算法(二)
- Part4:算法(三)
- Sift算法-----part4
- part4
- 算法08:归并(合并)排序——分治法Part4
- 【数据结构与算法学习笔记】PART4 树形结构(二叉树,堆)
- CS231n 学习笔记(4)——神经网络 part4 :BP算法与链式法则
- 《数字图像处理原理与实践(MATLAB版)》一书之代码Part4
- DotNet编程规范(草)part4
- DotNet编程规范(草)part4
- Drupal7模組介紹-Views-part4(排序功能)
- MySql数据类型分析(字符类型) Part4
- Redis笔记part4(列表类型)
- Part3:关联容器(二)&Part4:迭代器
- 剑指offer-算法题练习:part4 重建二叉树
- 人工神经网络:反向传播算法的数学基础(Part4)
- 黑马程序员-JAVA高级(IO输入与输出)PART4
- Caffe 入门- caffe数据准备,格式转换
- leetcode难度及面试频率
- 大话设计之模式总结——创建型模式
- UI系列网站
- 浅谈binder机制
- Part4:算法(一)
- 杭电ACM——HDU-1108最小公倍数
- [C#]冒泡排序
- CSS&JavaScript笔记
- JAVA NIO例子
- VMware 下的CentOS6.7 虚拟机与Windows7通信
- 《linux学习》之用户管理
- 华为OTT交流材料
- AngularJS ng-model获取不到WdatePicker值的解决方案