STL的其他用法总结

2017-08-20 17:26:07

writer:pprp

1、adjacent_find()

下面是源码实现:

template <class ForwardIterator>
ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last)
{
  if (first != last)
  {
    ForwardIterator next=first; ++next;
    while (next != last) {
      if (*first == *next)     // or: if (pred(*first,*next)), for version (2)
        return first;
      ++first; ++next;
    }
  }
  return last;
}

测试:

/*
name : STL的其他用法
writer : pprp
declare : null
date ; 2017/8/20
*/
#include <bits/stdc++.h>

using namespace std;
typedef list<int> LIST;

bool Equal(int a, int b)
{
      return (a - b)%2 == 0?1:0;
}

void print(LIST&q)
{
     LIST::iterator it;
     for(it = q.begin() ; it != q.end(); it++)
     {
           cout << *it << " ";
     }
     cout << endl;
}

int main()
{
      //adjacent_find 查找相邻元素
      LIST l;

      for(int i = 0 ; i < 10 ; i++)
      {
            l.push_back(i);
            l.push_back(i+1);
            l.push_back(i+1);
            l.push_back(i+2);
      }
      l.push_back(93);
      l.push_back(5);
      l.push_back(5);
      l.push_back(2);
      l.push_back(2);
      l.push_back(33);
      l.push_back(52);
      l.push_back(12);
      l.push_back(18);

      print(l);

      LIST::iterator it = adjacent_find(l.begin(),l.end());

      if(it != l.end())
      {
            cout << "两个相邻元素相等" << *it << " ";
            it++;
            cout << *it << endl;
      }

      list <int>::iterator ii = adjacent_find(l.begin(), l.end(), Equal);
      if(ii != l.end())
      {
            cout <<"找出首个两个相邻元素相同"<< *ii << " ";
            ii++;
            cout << *ii << endl;
      }

      return 0;
}

2、find_first_of查找第一个匹配字符串(不推荐使用,查看源代码采用最高复杂度的算法)

/*
name : STL的其他用法:find_first_of
writer : pprp
declare : null
date ; 2017/8/20
*/
#include <bits/stdc++.h>

using namespace std;

int main()
{
      char * s1 = "abcdefu7ghijklmn";
      char * s2 = "zyx3yu7ys";
      char * i = find_first_of(s1,s1 + strlen(s1),s2,s2 + strlen(s2));
      //第一个出现在s2中的字符为 *i
      cout << * i << endl;
      return 0;
}

3、堆排序(有点慢)

/*
name : STL中的堆排序
writer : pprp
declare : 复杂度为 nlogn
date ; 2017/8/20
*/
#include <bits/stdc++.h>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <vector>

using namespace std;

void print(int x)
{
      cout << x << " ";
}

int main()
{
      vector<int> v;
      int tmp;
      //每次执行的种子不同,生成的随机数才不相同
      srand((int)time(NULL));
      //产生10个随机数,记录在vector中
      for(int i = 0 ; i < 10 ; i++)
      {
           tmp = rand() % 100;
           v.push_back(tmp);
      } 

      for_each(v.begin(), v.end(),print);
      cout << endl;

      make_heap(v.begin(),v.end());
      sort_heap(v.begin(),v.end());

      for_each(v.begin(),v.end(),print);
      cout << endl;

      return 0;
}

4、归并算法(合并两个有序的序列)

/*
name : 归并排序,合并两个有序序列
writer : pprp
declare : 复杂度为 nlogn
date ; 2017/8/20
*/
#include <bits/stdc++.h>
#include <cstdio>
#include <cstdlib>
#include <ctime>

using namespace std;
const int maxn = 100;
int a[maxn];
int b[maxn];

void print(int *x,int n)
{
    for(int i = 0 ; i < n ; i++)
    {
        cout << x[i] << " ";
    }
    cout << endl;
}

int main()
{
    srand((int)time(NULL));
    //产生10个随机数,记录在vector中
    for(int i = 0 ; i < 6 ; i++)
    {
        a[i] = rand()%100;
        b[i] = rand()%100;
    }
    //升序
    sort(a,a+6);
    sort(b,b+6);

    print(a,6);
    print(b,6);

    int result[maxn*2];

    merge(a,a+6,b,b+6,result,less<int>());

    print(result,12);

    //降序
    sort(a,a+6,greater<int>());
    sort(b,b+6,greater<int>());

    merge(a,a+6,b,b+6,result,greater<int>());

    print(result,12);

    return 0;
}

5、binary_search折半查找(用在有序区间中)

bool binary_search(a,a+size,key)

6、includes判断集合包含关系

int a[5] = {0,2,5,12,54};
int b[10] = {12,32,34,54,6,34,54,23,2,24};

if(includes(a,a+5,b,b+5))
{
    cout << "yes" << endl;
}
else
{
    cout << "no" << endl;
}

7、最值

max(12,321);
min(21,32);
//查找线性容器中的最大最小
list <int> :: iterator it = min_element(l.begin(), l.end());
list <int> :: iterator it = max_element(l.begin(), l.end());
//字典序比较大小
lexicographical_compare(s1,s1+len1,s2,s2+len2);

8、组合数生成

/*
name : STL中的堆排序
writer : pprp
declare : 复杂度为 nlogn
date ; 2017/8/20
*/
#include <bits/stdc++.h>
#include <cstdio>
#include <cstdlib>
#include <ctime>

using namespace std;

void print(int a[])
{
      for(int i = 0; i < 5 ; i++)
      {
            cout << a[i] << " ";
      }
      cout << endl;
}

int main()
{
      int a[] = {3,5,6,7,9};
      while(next_permutation(a,a+5))
      {
            print(a);
      }
      cout << endl;

      while(prev_permutation(a,a+5))
      {
            print(a);
      }

      return 0;
}
时间: 2024-10-11 16:51:27

STL的其他用法总结的相关文章

C++中的STL中map用法详解

Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道.这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处. 下面举例说明什么是一对一的数据映射.比如一个班级中,每个学生的学号跟他的姓名就存在着一一

STL set 详细用法

一个集合(set)是一个容器,它其中所包含的元素的值是唯一的. 用到的库 #include <set> 定义 最简单: set<int> a; set和其他的stl一样,都支持自定义. 因为set会自动将元素从小到大排序,所以我们可以设定它的比较函数,这里与优先队列十分相似. 法1 利用自定义比较函数: #include<stdio.h> #include<set> #include<string> using namespace std; st

STL容器set用法以及codeforces 685B

以前没怎么用过set,然后挂训练赛的时候发现set的妙用,结合网上用法一边学一边写. 首先set是一种容器,可以跟其他STL容器一样用 set<int > s 来定义, 它包含在STL头文件#include<set>中. 其内部是用红黑树来实现的, 一个是保证set里面是有序的, 默认的排序是从小到大排序, 而且set容器的元素都是唯一的, 如果里面的元素允许重复那就用 multiset 容器来实现. 1. set的常用操作 s.begin() 返回set容器的第一个元素的位置(第

各种STL的基本用法

目录 STL及一些常用函数的基本用法 1.vector(向量)的基本用法 2.queue(队列)的基本用法 3.stack(栈)的基本操作 4.set(集合)的基本用法 5.map(映射)的基本用法 6.unorded_map的用法 7.list(列表)的基本用法 7.next_premutation(全排列)的用法 8.stringstream的用法 9.unique的用法 10.lower_bound的用法 11.string中的substr的用法 STL及一些常用函数的基本用法 1.vec

C++STL 常用 函数 用法

学完c++快一年了,感觉很有遗憾,因为一直没有感觉到c++的强大之处,当时最大的感觉就是这个东西的输入输出比C语言要简单好写. 后来我发现了qt,opencv,opengl,原来,c++好玩的狠. 在这些图形库之外,最常用的可能就是STL,这个东西由于当时学c++的时候迷迷糊糊,完全是一头雾水,上学期数据结构之后开始有点儿开窍了,现在把才c++STL中常用的函数,用法贴一下,也是记录一下,希望能给一样迷糊的盆友们一些帮助. 整理自<ACM程序设计> 迭代器(iterator) 个人理解就是把所

STL sort 的用法

sort的原型: default (1) template <class RandomAccessIterator> void sort (RandomAccessIterator first, RandomAccessIterator last); custom (2) template <class RandomAccessIterator, class Compare> void sort (RandomAccessIterator first, RandomAccessIt

STL集合的用法

首先直接贴出来例程: 1 #include<iostream> 2 #include<set> 3 using namespace std; 4 struct Info //如果集合中的元素是自定义类型,一定要重载<运算符 5 { 6 string name; 7 double score; 8 bool operator<(const Info &a) const 9 { 10 return a.score<score; 11 } 12 }; 13 se

STL set简单用法

set的常见用法详解 set翻译为集合,是一个内部自动有序并且不含重复元素的容器. 可以用于去掉重复元素,或者元素过大,或者不能散列的情况,set只保留元素本身而不考虑它的个数. 头文件:#include<set> set的定义 单独定义一个set: set<typename> name; //与其他容器一样,要注意不要出现>>两个大于号相连 set容器内元素的访问 set只能通过迭代器访问. set<typename>::iterator it; set的

STL————vector的用法

一.什么是vector? 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container).跟任意其它类型容器一样,它能够存放各种类型的对象.可以简单的认为,向量是一个能够存放任意类型的动态数组. 二.容器特性 1.顺序序列 顺序容器中的元素按照严格的线性顺序排序.可以通过元素在序列中的位置访问对应的元素. 2.动态数组 支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作.操供了在序列末尾相对快速地添加/删除元素的操作. 3.能够感知内存分配器的