zoukankan      html  css  js  c++  java
  • 几个STL算法:includes,set_difference、set_intersection、set_symmetric_difference、set_union, pre_permutation, next_permutation

    includes:

    测试有序序列中是否包含另一个序列的全部元素。

    template<class inputIterator1, class inputIterator2>

    bool includes(inputIterator1 first1, inputIterator1 last1,

                         inputIterator2 first2, inputIterator2 last2);

    template<class inputIterator1 , class inputIterator2, class Comp>

    bool includes(inputIterator1 first1, inputIterator1 last1,

                         inputIterator2 first2, inputIterator2 last2,

                         Comp cmp);

    两个序列必须都是排序的且相同的排序,Comp必须和两个序列用相同的排序函数对象。

    鉴于以上特点,用std::set<T>作为容器比较好。

    set_differrence:包含在第一个有序集合中,但不包含第二个有序集合中的元素,这些不同的元素复制到最后一个参数中,最后一个参数是一个保存这些元素的容器的首迭代器,这个容器必须预先分配足够的空间来容纳元素。这些不同的元素也是有序的且排序方式与源有序集合一样,另外Comp也必须和源有序集合采用同样的排序方式。

    两个有序序列不可以有重叠。

    返回的是在有序序列1而不是有序序列2中的元素。

    template<class inputIterator1, class inputIterator2,

                    class outputIterator>

    outputIterator result =

    set_difference(inputIterator1 first1, inputIterator1 last1,

                          inputIterator2 first2, inputIterator2 last2,

                          outputIterator first);

    template<class inputIterator1, class inputIterator2,

                    class outputIterator>

    outputIterator result =

    set_difference(inputIterator1 first1, inputIterator1 last1,

                          inputIterator2 first2, inputIterator2 last2,

                          outputIterator first, Comp cmp);

    还是用set容器比较好。

    set_intersection:同时包含第一个和第二个集合中的元素,这些元素被复制到最后一个参数中,最后一个参数是一个保存这些元素的容器的首迭代器,这个容器必须预先分配足够的空间来容纳元素。两个集合都必须是有序的且是相同的排序。

    基本上和set_difference用法一样,只是找出交集而已。还是用set。

    set_symmetric_difference:包含在第一个集合但是不包含在第二个集合中的元素,包含在第2个集合但是不包含在第1个集合中的元素,同时被复制到最后一个参数中。用法跟基本上和set_difference用法一样。两个集合都必须是有序的且是相同的排序。

    set_union:包含两个集合中所有元素的几个,同时被复制到最后一个集合中。 两个集合都必须是有序的且是相同的排序。

    也就是求两个元素的公共元素,用法基本同set_difference。

    pre_permutation:重排区间中的元素,使得源序列变成按照字典序列的上一个序列,其中的“上一个”可由用户自己定义。

    template<class Iterator>

    bool pre_permutation(Iterator first, Iterator last);

    template<class Iterator, class Comp>

    bool pre_permutation(Iterator first, Iterator last, Comp cmp);

    int main()
    {
     vector<int> p;
     p.push_back(2);
     p.push_back(2);
     p.push_back(1);
     p.push_back(-1);
     p.push_back(0);

     do {
      copy(p.begin(), p.end(), ostream_iterator<int>(cout, " "));
      cout << "/n";
     } while (prev_permutation(p.begin(), p.end()));
    }

    next_permutation的用法同pre_permutation.

  • 相关阅读:
    AQS笔记二 ---- 使用AQS自定义锁
    AQS笔记一 --- 源码分析
    ElasticSearch(二十一)正排和倒排索引
    ElasticSearch(二十)定位不合法的搜索及其原因
    ElasticSearch(十八)初识分词器
    ElasticSearch(十七)初识倒排索引
    还在用 kill -9 停机?这才是最优雅的姿势(转)
    一文快速搞懂MySQL InnoDB事务ACID实现原理(转)
    你真的理解零拷贝了吗?(转)
    关于分布式事务的读书笔记
  • 原文地址:https://www.cnblogs.com/kex1n/p/2286422.html
Copyright © 2011-2022 走看看