资源描述
C+ STL学习STL_algorithm今天我们来讲讲STL中比较大的一种库. 重要是某些算法的运算的实现,示例代码上传至 。 在使用STL中的algorithm之前,需要导入头文献#include.(1)max(),min()cpp view plain copy print?在CODE上查看代码片派生到我的代码片void MaxAndMin() int maxI = 3; int maxJ = 4; cout 较大值为: max(maxI,maxJ) endl; cout 较小值为: min(maxI,maxJ) endl; max和min就是取两个数中的最大值与最小值。(2)由于下面有些措施的示例需要打印vector,因此我在这里先实现vector的打印算法cpp view plain copy print?在CODE上查看代码片派生到我的代码片void PrintVector(vector v) vector:iterator vIterator; for (vIterator = v.begin(); vIterator != v.end(); vIterator+) cout *vIterator ; cout endl; 这里使用迭代器来访问vector,并按顺序打印成果。(3)sort(),reverse()cpp view plain copy print?在CODE上查看代码片派生到我的代码片void SortAndReverse() vector myVector; myVector.push_back(2); myVector.push_back(9); myVector.push_back(1); myVector.push_back(0); myVector.push_back(7); cout 排序前的序列:; PrintVector(myVector); sort(myVector.begin(), myVector.end(); cout 升序排序后的序列:; PrintVector(myVector); reverse(myVector.begin(), myVector.end(); cout 降序排序后的序列:; PrintVector(myVector); sort是升序排序函数,reverse是降序排序函数。vector自身自己也有sort可以直接调用。(4)find()cpp view plain copy print?在CODE上查看代码片派生到我的代码片void FindVector() vector myVector; myVector.push_back(2); myVector.push_back(4); myVector.push_back(6); myVector.push_back(8); myVector.push_back(0); vector:iterator vIterator; vIterator = find(myVector.begin(), myVector.end(), 6); if (vIterator = myVector.end() cout 未找到 endl; else cout 找到: *vIterator endl; find函数使用迭代器来进行查找某个数,如果达到end位置还没有找到,则表达没有这个数。迭代器会在第一次浮现该数字时返回。(5)equal()cpp view plain copy print?在CODE上查看代码片派生到我的代码片void EqualVector() vector myVector1; myVector1.push_back(1); myVector1.push_back(5); myVector1.push_back(7); myVector1.push_back(9); vector myVector2; myVector2.push_back(1); myVector2.push_back(5); myVector2.push_back(7); myVector2.push_back(9); bool isEqual = equal(myVector1.begin(), myVector1.end(), myVector2.begin(); if (isEqual) cout 相等 endl; else cout 不相等 endl; equal()可以判断两个vector与否相等,equal会根据每一种位置去进行比较。(6)merge()cpp view plain copy print?在CODE上查看代码片派生到我的代码片void MergeVector() vector myVector1; myVector1.push_back(1); myVector1.push_back(5); myVector1.push_back(7); myVector1.push_back(9); vector myVector2; myVector2.push_back(2); myVector2.push_back(3); myVector2.push_back(4); myVector2.push_back(5); / 需要在合并前排序 sort(myVector1.begin(), myVector1.end(); sort(myVector2.begin(), myVector2.end(); / 需要指定成果集的大小 vector myResult(8); merge(myVector1.begin(), myVector1.end(), myVector2.begin(), myVector2.end(), myResult.begin(); cout 合并后的序列为:; PrintVector(myResult); merge可以实现两个有序vector的合并,合并后的vector仍然是有序的。合并后的vector放到新的成果集中,需要事先指定其大小。(7)swap()cpp view plain copy print?在CODE上查看代码片派生到我的代码片void SwapObject() int i = 2; int j = 3; cout 互换之前两个数的值:; cout i = i ;j = j endl; swap(i, j); cout 互换之后两个数的值:; cout i = i ;j = j unique-erase / vector可以由数组进行初始化 void UniqueVector() int array = 5, 3, 1, 3, 2, 5; vector vectorFromArray(array, array + sizeof(array) / sizeof(int); sort(vectorFromArray.begin(), vectorFromArray.end(); vector:iterator iter = unique(vectorFromArray.begin(), vectorFromArray.end(); vectorFromArray.erase(iter, vectorFromArray.end(); cout 去重之后的序列:; PrintVector(vectorFromArray); 由代码中可以看到,vector并不一定需要通过push_back来创立,而是可以通过array初始化。这里的去重有一种缺陷,就是需要先进行排序,也就是会变化原先vector的构造。(9)replace()cpp view plain copy print?在CODE上查看代码片派生到我的代码片void ReplaceVector() int array = 2, 4, 6, 8, 9; vector myVector(array, array + sizeof(array) / sizeof(int); cout 替代之前的序列:; PrintVector(myVector); replace(myVector.begin(), myVector.end(), 8, 888); cout 替代之后的序列:; PrintVector(myVector); replace会查找原先序列中与否有某个数,若存在,则会进行替代。(10)remove()cpp view plain copy print?在CODE上查看代码片派生到我的代码片/ 删除操作和去重操作是类似的,实际使用remove的时候,并没有删除那个元素,而是用背面的那个 / 元素替代了想要删除的元素。最后要使用erase措施删除。 / 但是只能删除第一次浮现的那个数字,而第二个元素不可删除。 void RemoveVector() int array = 1, 2, 3, 4, 5; vector myVector(array, array + sizeof(array) / sizeof(int); cout 删除元素前的序列:; PrintVector(myVector); vector:iterator Iter = remove(myVector.begin(), myVector.end(), 4); myVector.erase(Iter); cout 删除元素前的序列:; PrintVector(myVector); 删除vector中的某个元素,一方面使用迭代器来进行定位,然后使用erase进行擦除。注意,只能删除第一次浮现的该数字,第二次浮现的该数组则不能被删除。(11)for-each()cpp view plain copy print?在CODE上查看代码片派生到我的代码片/ 遍历序列中的每个元素,然后去执行某个措施 void ForEach() int array = 3, 5, 7, 9, 1; vector myVector(array, array + sizeof(array) / sizeof(int); cout for-each之前的序列:; PrintVector(myVector); for_each(myVector.begin(), myVector.end(), PrintElement); cout for-each之后的序列:; PrintVector(myVector); / 传引用,就可以变化原序列 void PrintElement(int &ele) ele = ele * ele; for-each是对序列中的每个元素进行迅速遍历,然后在遍历过程中对每个元素执行一定的操作,示例代码中是对每个元素求平方,这样就可以变化原序列。(12)count()cpp view plain copy print?在CODE上查看代码片派生到我的代码片void CountVector() int array = 4, 4, 6, 9, 0, 0, 0; vector myVector(array, array + sizeof(array) / sizeof(int); / 这里默认返回的是long long num = count(myVector.begin(), myVector.end(), 0); cout 某个值浮现的次数为: num endl; count用于计算某个值浮现的次数。(13)copy()cpp view plain copy print?在CODE上查看代码片派生到我的代码片void CopyVector() int arr = 2, 3, 4, 5, 6; vector myVector(arr, arr + sizeof(arr) / sizeof(int); / 这里需要指定大小 vector myVectorCopy(5); copy(myVector.begin(), myVector.end(), myVectorCopy.begin(); cout 拷贝后的序列为:; PrintVector(myVctorCopy); 可以根据原有的序列复制出一种新的序列,需要事先指定大小。(14)generate()cpp view plain copy print?在CODE上查看代码片派生到我的代码片void GenerateVector() vector myVector(6); generate(myVector.begin(), myVector.end(), rand); cout 生成的随机序列为:; PrintVector(myVector); generate可以生成指定大小的随机序列。(15)move()cpp view plain copy print?在CODE上查看代码片派生到我的代码片void MoveVector() int arr = 4, 6, 8, 2, 0; vector myVector(arr, arr + sizeof(arr) / sizeof(int); vector myVectorMove(10); / 初始值为0 move(myVector.begin(), myVector.end(), myVectorMove.begin() + 5); cout 移动后的序列为:; PrintVector(myVectorMove); 可以把序列向前或向后移动若干个位置,空位用0补。(16)fill()cpp view plain copy print?在CODE上查看代码片派生到我的代码片/* * vector的初始化可以用array,也可以直接用. */ void FillVector() vector myVector3, 4, 5, 6, 7; cout 初始的序列为:; PrintVector(myVector); / 数据所有填充为* fill(myVector.begin(), myVector.end(), 99); cout 填充后的序列为:; PrintVector(myVector); 可以把序列指定位置范畴内的元素使用某个数字进行填充。(17)rotate()cpp view plain copy print?在CODE上查看代码片派生到我的代码片/ rorate函数将first, middle)内的元素和middle, last)内的元素互换,middle所指元素成为容器的第一种元素。 void RotateVector() vector myVector4, 5, 0, 1, 9; cout 旋转前的序列为:; PrintVector(myVector); rotate(myVector.begin(), myVector.begin() + 3, myVector.end(); cout 旋转后的序列为:; PrintVector(myVector); 从序列的某个位置起进行翻转。(18)有关堆的操作cpp view plain copy print?在CODE上查看代码片派生到我的代码片/ 有关堆的操作 void Heap() int arr = 3, 7, 9, 1, 0, 6; vector myVector(arr, arr + sizeof(arr) / sizeof(int); / 建立一种最大堆,第三个参数less为最大堆,greater为最小堆;默觉得最大堆; make_heap(myVector.begin(), myVector.end(),less(); PrintVector(myVector); / 新添加一种元素在末尾,然后重新调节堆序。也就是把元素添加在底层vector的end处。 / 要先在容器中加入数据,再调用push_heap; myVector.push_back(99); push_heap(myVector.begin(), myVector.end(); PrintVector(myVector); / 把堆顶元素取出来,放到数组或者是vector的末尾,用本来末尾元素去替代。 / 要先调用pop_heap,再到容器中删除数据; pop_heap(myVector.begin(), myVector.end(); myVector.pop_back(); PrintVector(myVector); / 排序之后就不是一种合法的堆了 sort_heap(myVector.begin(), myVector.end(); PrintVector(myVector); 上面波及到堆的操作,make_heap用来建立一种大顶堆或者小顶堆。向堆中插入一种元素需要先向vector中插入,然后再调用push_heap,push_heap的过程就是调节堆的过程。 同样的,从堆中取出一种元素,需要先调节堆,把需弹出元素放到vector末尾,然后再删除元素。 好好掌握STL的函数库调用,可以大大提高编程效率和能力。对某些算法题的解决也会有更好的思路。
展开阅读全文