zoukankan      html  css  js  c++  java
  • 容器特有的算法

    list 容器上的迭代器是双向的,而不是随机访问类型。

    由于 list 容器不支持随机访问,因此,在此容器上不能使用需要随机访问迭代器的算法。
    这些算法包括 sort 及其相关的算法。
    还有一些其他的泛型算法,如 merge、remove、reverse 和 unique,
    虽然可以用在 list 上,但却付出了性能上的代价。
    如果这些算法利用 list 容器实现的特点,则可以更高效地执行。

    如果可以结合利用 list 容器的内部结构,则可能编写出更快的算法。
    与其他顺序容器所支持的操作相比,标准库为 list 容器定义了更精细的操作集合,使它不必只依赖于泛型操作。
    表 11.4 列出了 list 容器特有的操作,其中不包括要求支持双向或更弱的迭代器类型的泛型算法,
    这类泛型算法无论是用在 list 容器上,还是用在其他容器上,都具有相同的效果。

    // 表 11.4. list 容器特有的操作
    lst.merge(lst2) lst.merge(lst2, comp)
      将 lst2 的元素合并到 lst 中。这两个 list 容器对象都必须排序。lst2 中的元素将被删除。
      合并后,lst2 为空。返回 void 类型。
      第一个版本使用 < 操作符,而第二个版本则使用 comp 指定的比较运算
    
    lst.remove(val) lst.remove_if(unaryPred)
      调用 lst.erase 删除所有等于指定值或使指定的谓词函数返回非零值的元素。
      返回 void 类型
    
    lst.reverse()  反向排列 lst 中的元素
    
    lst.sort     对 lst 中的元素排序
    
    lst.splice(iter, lst2)
    lst.splice(iter, lst2, iter2)
    lst.splice(iter, beg, end)
       将 lst2 的元素移到 lst 中迭代器 iter 指向的元素前面。在 lst2 中删除移出的元素。
       第一个版本将 lst2 的所有元素移到 lst 中;合并后,lst2 为空。lst 和 lst2 不能是同一个 list 对象。
       第二个版本只移动 iter2 所指向的元素,这个元素必须是 lst2 中的元素。
         其中,lst 和 lst2 可以是同一个 list 对象。即可在一个 list 对象中使用 splice 运算移动一个元素。
       第三个版本移动迭代器 beg 和 end 标记的范围内的元素。beg 和 end 照例必须指定一个有效的范围。
         这两个迭代器可标记任意 list 对象内的范围,包括 lst。
         当它们指定 lst 的一段范围时,如果 iter 也指向这个范围的一个元素,则该运算未定义。
    
    lst.unique() lst.unique(binaryPred)
    调用 erase 删除同一个值的团结副本。
    第一个版本使用 == 操作符判断元素是否相等;
    第二个版本则使用指定的谓词函数实现判断

    注意:对于 list 对象,应该优先使用 list 容器特有的成员版本,而不是泛型算法。

    大多数 list 容器特有的算法类似于其泛型形式中已经见过的相应的算法,但并不相同:

    l.remove(val); // removes all instances of val from 1
    l.remove_if(pred); // removes all instances for which pred is true from 1
    l.reverse(); // reverses the order of elements in 1
    l.sort(); // use element type < operator to compare elements
    l.sort(comp); // use comp to compare elements
    l.unique(); // uses element == to remove adjacent duplicates
    l.unique(comp); // uses comp to remove duplicate adjacent copies

    list 容器特有的算法与其泛型算法版本之间有两个至关重要的差别
    其中一个差别是 remove 和 unique 的 list 版本修改了其关联的基础容器:真正删除了指定的元素。
    例如,list::unique 将 list 中第二个和后续重复的元素删除出该容器。

    与对应的泛型算法不同,list 容器特有的操作能添加和删除元素。

    另一个差别是 list 容器提供的 merge 和 splice 运算会破坏它们的实参。
    使用 merge 的泛型算法版本时,合并的序列将写入目标迭代器指向的对象,而它的两个输入序列保持不变。
    但是,使用 list 容器的 merge 成员函数时,则会破坏它的实参 list 对象——
    当实参对象的元素合并到调用 merge 函数的 list 对象时,实参对象的元素被移出并删除。

  • 相关阅读:
    <span>和<div>标签的隐藏和显示切换
    重启svn
    Mac下配置apache
    iOS时间显示今天昨天
    关于UIPageViewController那些事
    关于plist文件的那些事
    Xcode调试LLDB
    Reveal安装
    静态初始化器
    Static简介
  • 原文地址:https://www.cnblogs.com/yshl-dragon/p/3184393.html
Copyright © 2011-2022 走看看