zoukankan      html  css  js  c++  java
  • STL学习笔记(五) 算法

    条款30:确保目标区间足够大
    条款31:了解各种与排序有关的选择
    //使用unaryPred划分输入序列,使得unaryPred为真的元素放在序列开头
    partition(beg, end, unaryPred);        
    //对[beg, mid)个元素进行排序,排序后[beg, end)范围元素有序,且为全排序之后的最终位置
    partial_sort(beg, mid, end, comp);    
    //排序后score前3个元素有序且为整个序列的前3名
    eg: partial_sort(score.begin(), score.begin() + 3, score.end());
    nth_element(beg, nth, end, comp);    //实参nth必须是一个迭代器,定位输入序列中的一个元素
    //执行完之后,位置nth上元素为全排序之后应该放置的元素,且nth之前的元素(不一定有序)都 <= nth所表示值,nth之后的元素(不一定有序)都 >= nth所表示值
    nth_element(score.begin(), score.begin() + score.size() / 2, score.end());

    partial_sort、nth_element、sort都是非稳定的排序算法,都要求随机访问迭代器(所以只能应用于 vector、string、deque、array)

    总结:
    (1)如果需要对vector、string、deque、array所有元素执行完全排序,可以使用sort或者stable_sort
    (2)如果只需要对vector、string、deque、array最前面的n个元素进行排序,可以使用 partial_sort
    (3)如果vector、string、deque、array 需要找到排序后第n个位置上的元素,或者只需要找到最前面的n个元素(这些元素不是有序),可以使用nth_element
    (4)如果是list容器,可以使用list::sort(成员函数,稳定排序),但是没有partial_sort和nth_element
    条款32:如果确实需要删除元素,则需要在 remove 这一类算法之后调用 erase

    remove 移动了区间中的元素,结果是:"不用被删除"的元素移到了区间的前面(保持原有的相对顺序),返回一个迭代器指向最后一个"不用被删除"的下一个元素
    如果真想删除元素,那就必须在remove之后使用erase
    vec.erase(remove(vec.begin(), vec.end(), 2012), vec.end());
    remove_if 和 unique 的用法与remove完全相同,都必须结合 erase 完成真正的操作

    条款33:对包含指针的容器使用 remove 这一类算法时要特别小心

    对包含指针的容器使用 remove-erase 会造成内存泄露,可使用 shared_ptr 代替

    条款34:  了解哪些算法要求使用排序的区间作为参数

    以下算法必须使用排序区间作为参数:
    O(log n)的二分搜索相关算法: binary_search, lower_bound, upper_bound, equal_range
    O(n)的集合操作: set_union, set_intersection, set_difference, set_symmetric_difference

    条款35:通过 mismatch 实现简单的忽略大小写的字符串比较
    条款36:了解 copy_if的实现
    条款37:使用 accumulate或者for_each进行区间统计

    accumulate使用第三个参数的类型推导出最后计算结果的类型,所以以下两个计算结果完全不同:

    double sum = accumulate(vec.begin(), vec.end(), 0.0); //计算结果类型为double
    double sum = accumulate(vec.begin(), vec.end(), 0);//计算结果为int变量,最后转为double型 

    计算连乘积:

    vector<double> vec;
    double product = accumulate(vec.begin(), vec.end(), 1.0, multiplies<double>()); 

    //multiplies为仿函数; 注意连乘初始值为1.0
  • 相关阅读:
    Python多线程编程
    Python解析HTML的开发库pyquery
    Python标准库之urllib,urllib2自定义Opener
    Python标准库之urllib,urllib2
    Python中Cookie的处理(二)cookielib库
    Python中Cookie的处理(一)Cookie库
    Linux下删除大量文件
    部分Dojo常用函数简介(三)——页面生命周期及DOM相关常用函数
    Web流程
    如何理解JS项目
  • 原文地址:https://www.cnblogs.com/wwwjieo0/p/3444033.html
Copyright © 2011-2022 走看看