算法设计工具——STL

文章目录

  • STL
    • STL算法
    • STL迭代器
    • STL容器
      • 顺序容器
        • 向量(vector)
        • 字符串(string)
        • 双端队列(deque)
        • 链表(list)
      • 关联容器
        • 集合(set)/多重集合(multiset)
        • 映射(map)/多重映射(multimap)
      • 适配器容器
      • 栈(stack)
      • 队列(queue)
      • 优先队列(priority_queue)

STL

STL由容器、算法、迭代器三部分构成

STL算法

主要由头文件组成

  • 功能涉及容器元素的比较、交换、查找、遍历、复制、修改、删除、排序和合并等操作
  • 只包括几个简单数学运算的模板函数
  • 定义了一些模板类用于声明关系函数对象

STL迭代器

  STL迭代器用于访问容器中的数据对象。每个容器都有自己的迭代器,算法通过迭代器来定位和操作容器中的元素

 常用的迭代器:

  • iterator:指向容器中存放元素的迭代器,用于正向遍历容器中的元素
  • const_iterator:指向容器中存放元素的常量迭代器,只能读取容器中的元素。
  • reverse_iterator:指向容器中存放元素的反向迭代器,用于反向遍历容器中的元素
  • const_reverse_iterator:指向容器中存放元素的常量反向迭代器,只能读取容器中的元素

 迭代器的常用运算:

  • ++:正向移动迭代器
  • --:反向移动迭代器
  • *:返回迭代器所指的元素值

  迭代器类似于指针,如果迭代器到达了容器中最后一个元素的后面,则迭代器变成一个特殊的值,就好像NULL或未初始化的指针一样

STL容器

一个STL容器就是一种数据结构

顺序容器

   顺序容器按照线性次序的位置存储数据。

向量(vector)

   向量容器相当于数组,它存储具有相同类型的一组元素,它可以从末尾快速地插入与删除元素,快速地随机访问元素,但是在序列中间插入、删除元素较慢,因为需要移动插入或删除位置后面的所有元素

定义方式如下

//定义元素为int的向量v1
vector<int> v1;
//指定v2的初始大小为10个int元素
vector<int> v2(10);
//指定v3的10个初始元素的初值为1.23
vector<double> v3(10, 1.23);
//用数组a[0..4]共5个元素初始化v4
vector<int> v4(a, a + 5);
  • empty():判断当前向量容器是否为空
  • size():返回当前向量容器中的实际元素个数
  • []:返回指定下标的元素
  • reserve(n):为当前向量容器预分配n个元素的存储空间
  • capacity():返回当前向量容器在重新进行内存分配以前所能容纳的元素个数
  • resize(n):调整向量容器的大小,使其能容纳n个元素
  • push_back():在当前向量容器尾部添加一个元素
  • insert(pos, elem):在pos位置插入元素elem,即将元素elem插入到迭代器pos指定的元素之前
  • front():获取当前向量容器的第一个元素
  • back():获取当前元素向量的最后一个元素
  • erase():删除当前向量容器中某个迭代器或者迭代器区间指定的元素
  • clear():删除当前向量容器中的所有元素
  • begin():该函数的两个版本返回iterator或const_iterator,引用容器的第一个元素
  • end():该函数的两个版本返回iterator或const_iterator,引用容器的最后一个元素后面的一个位置
  • rbrgin():该函数的两个版本返回reverse_iterator或const_reverse_iterator,引用容器的最后一个元素
  • rend():该函数的两个版本返回reverse_iterator或const_reverse_iterator,引用容器的第一个元素前面的一个位置

字符串(string)

  它所有元素为字符类型,类似于vector

 创建方式如下

  • string():建立一个空的字符串
  • string(const string& str):用字符串str建立当前字符串
  • string(const string& str, size_type str_idx):用字符串str起始于str_idx的字符建立当前字符串
  • string(const string& str, size_type str_idx, size_type str_num):用字符串str起始于str_idx的str_num个字符建立当前字符串
  • string(const char* cstr):用字符数组存放的字符串cstr建立当前字符串
  • string(const char* chars, size_type chars_len):用字符数组存放的字符串cstr开头的chars_len个字符建立当前字符串
  • string(size_type num, char c):用num个字符c建立当前字符串

常用函数如下:

  • empty():判断当前字符串是否为空串
  • size():返回当前字符串的实际字符个数(返回结果为size_type类型)
  • length:返回当前字符串的实际字符个数
  • [idx]:返回当前字符串位于idx位置的字符,idx从0开始
  • at[idx]:返回当前字符串位于idx位置的字符
  • compare(const string& str):返回当前字符串与字符串str的比较结果,若两者相等,返回0;若前者小于后者,返回-1,否则返回1
  • append(cstr):在当前字符串的末尾添加一个字符串str
  • insert(size_type idx, const string& str):在当前字符串的idx处插入一个字符串str
  • find(string& s, size_type pos):从当前字符串中的pos位置开始查找字符串s的第一个位置,找到后返回其位置,若没有找到返回-1
  • replace(size_type idx, size_type len, const string& str):将当前字符串中起始于idx的len个字符用一个字符串str替换
  • replace(iterator beg, iterator end, const string& str):将当前字符串中由迭代器beg和end所指区间用一个字符串str替换
  • substr(size_type idx):返回当前字符串起始于idx的子串
  • substr(size_type idx, size_type len):返回当前字符串起始于idx的长度为len的子串
  • clear():删除当前字符串中的所有字符
  • erase():删除当前字符串中的所有字符
  • erase(size_type idx):删除当前字符串从idx开始的所有字符
  • erase(size_type idx, size_type len):删除当前字符串从idx开始的len个字符

双端队列(deque)

  双端队列容器由若干个块构成,每个块中元素的地址是连续的,块之间的地址是不连续的,系统有一个特定的机制将这些块构成一个整体。所以空间的重新分配比vector快,因为重新分配空间后原有的元素不需要复制。

  用户可以从前面或后面快速地插入与删除元素,并可以快速地随机访问元素,但在中间位置插入和删除元素较慢。

  定义方式如下:

deque<int> dq1;
deque<int> dq2(10);//指定dq2的初始大小为10个int元素
deque<double> dq3(10, 1.23);
deque<int> dq4(dq2.begin(), bq2.end());//用dq2的所有元素初始化dq4

主要成员函数如下:

  • empty():判断双端队列容器是否为空队
  • size():返回双端队列容器中的元素个数
  • front():取队头元素
  • back():取队尾元素
  • push_front(elem):在队头插入元素elem
  • push_back(elem):在队尾插入元素elem
  • pop_front():删除队头一个元素
  • pop_back():删除队尾一个元素
  • erase():在双端队列容器中删除一个或几个元素
  • clear():删除双端队列容器中所有的元素
  • begin():该函数的两个版本返回iterator或const_iterator,引用容器的第一个元素
  • end():该函数的两个版本返回iterator或const_iterator,引用容器的最后一个元素后面的一个位置
  • rbegin():该函数的两个版本返回reverse_iterator或const_reverse_iterator,引用容器的最后一个元素
  • rend():该函数的两个版本返回reverse_iterator或const_reverse_iterator,引用容器的第一个元素前面的一个位置

链表(list)

  它是一个双链表类模板,可以从任何地方地方快速插入与删除。
  它的每个节点之间通过指针链接,不能随机访问元素
  list容器插入元素比vector快,对每个元素单独分配空间,所以不存在空间不够需要重新分配的情况。

  • empty():判断链表容器是否为空
  • size():返回链表容器中的实际元素个数
  • push_back():在链表尾部插入元素
  • pop_back():删除链表容器的最后一个元素
  • remove():删除链表容器中所有指定值的元素
  • remove_if(cmp):删除链表容器中满足条件的元素
  • erase():从链表容器中删除一个或几个元素
  • unique():删除链表容器中相邻的重复元素
  • clear():删除链表容器中的所有元素
  • insert(pos, elem):在pos位置插入元素elem,即将elem插入到迭代器pos指定的元素之前
  • insert(pos, n, elem):在pos位置插入n个元素elem
  • insert(pos, pos1, pos2):在迭代器pos处[pos1, pos2)的元素
  • reverse():反转链表
  • sort():对链表容器中的元素排序
  • begin():该函数的两个版本返回iterator或const_iterator,引用容器的第一个元素
  • end():该函数的两个版本返回iterator或const_iterator,引用容器的最后一个元素后面的一个位置
  • rbegin():该函数的两个版本返回iterator或const_iterator,引用容器的最后一个元素后面的一个位置
  • rend():该函数的两个版本返回reverse_iterator或const_reverse_iterator,引用容器的第一个元素前面的一个位置

关联容器

  关联容器中每个元素有一个key,通过key来存储和读取元素,这些关键字不一定与元素在容器中的位置有关

集合(set)/多重集合(multiset)

  set中元素的关键字是唯一的,multiset中元素的关键字可以不唯一,默认情况下会对元素按关键字自动进行升序排列。

set中没有相同关键字的元素,在向set插入元素时,如果已经存在则不插入。

multiset中允许存在两个相同关键字的元素,删除操作时删除multiset中值等于elem的所有元素,若删除成功返回删除个数,否则返回0.

  • empty():判断容器是否为空
  • size():返回容器中的实际元素个数
  • insert():插入元素
  • erase():从容器中删除一个或几个元素
  • clear():删除所有元素
  • count(k):返回容器关键字k出现的次数
  • find(k):如果容器中存在关键字为k的元素,返回该元素的迭代器,否则返回end()值
  • upper_bound():返回一个迭代器,指向关键字大于k的第一个元素
  • lower_bound():返回一个迭代器,指向关键字不小于k的第一个元素
  • begin():用于正向迭代,返回元素中第一个元素的位置
  • end():用于正向迭代,返回容器中最后一个元素后面的一个位置
  • rbegin():用于反向迭代,返回容器中最后一个元素的位置
  • rend():用于反向迭代,返回容器中第一个元素前面的一个位置

映射(map)/多重映射(multimap)

集合中的key和value都是key类型,而映射则是pair类结构

按key的升序排列,以红黑树的形式存储,可以根据key快速找到value(查找时间复杂度为 O ( l o g 2 n ) O(log_2n) O(log2n))

map不允许关键字重复出现,支持[]运算符;而multimap中允许关键字重复出现,但不支持[]

  • empty():判断容器是否为空
  • size():返回容器中的实际元素个数
  • map[key]:返回关键字为key的元素的引用,如果不存在这样的关键字,则以key作为关键字插入一个元素(不适合mutimap)
  • insert(elem):插入一个元素elem并返回该元素的位置
  • clear():删除所有元素
  • count():容器中指定关键字的元素个数(map中只有0和1)
  • find():在容器中查找元素
  • begin():于正向迭代,返回元素中第一个元素的位置
  • end():用于正向迭代,返回容器中最后一个元素后面的一个位置
  • rbegin():用于反向迭代,返回容器中最后一个元素的位置
  • rend():用于反向迭代,返回容器中第一个元素前面的一个位置

适配器容器

  适配器容器是指基于其他容器实现的容器,在底层容器的基础上实现适配器容器的功能

栈(stack)

  栈容器的默认底层容器是deque。用户也可以指定其他底层容器

stack<string, vector<string>> my_stack; //指定底层容器为vector

 stack的主要成员函数如下:

  • empty():判断栈容器是否为空
  • size():返回栈容器中实际元素个数
  • push(elem):元素elem进栈
  • top():返回栈顶元素
  • pop():元素出栈
#include
#include
using namespace std;
int main(){
	stack<int> st;
	st.push(1);st.push(2);st.push(3);
	printf("栈内元素个数:%d\n",st.size());
	printf("栈顶元素:%d\n",st.top());
	printf("出栈顺序:");
	while(!st.empty()){
		printf("%d ",st.top());
		st.pop();
	}
    return 0;
}


程序执行结果如下

栈内元素个数:3
栈顶元素:3
出栈顺序:3 2 1

队列(queue)

  和数据结构中的队列一样,具有先进先出的特点,不允许顺序遍历

  • empty():判断队列容器是否为空
  • size():返回队列容器中的实际元素个数
  • front():返回队头元素
  • back():返回队尾元素
  • push(elem):元素elem入队
  • pop():元素出队

优先队列(priority_queue)

  优先队列是一种具有受限访问操作的存储结构,元素可以以任意顺序进入优先队列。出队顺序将出队列中优先级最高的元素。

 主要成员函数如下:

  • empty():判断优先队列容器是否为空
  • size():返回优先队列容器中的实际元素个数
  • top():返回队头元素
  • push(elem):元素elem入队
  • pop():元素出队

你可能感兴趣的:(学习笔记,#,算法)