STL由容器、算法、迭代器三部分构成
主要由头文件
、
、
组成
功能涉及容器元素的比较、交换、查找、遍历、复制、修改、删除、排序和合并等操作
只包括几个简单数学运算的模板函数
定义了一些模板类用于声明关系函数对象STL迭代器用于访问容器中的数据对象。每个容器都有自己的迭代器,算法通过迭代器来定位和操作容器中的元素
常用的迭代器:
iterator
:指向容器中存放元素的迭代器,用于正向遍历容器中的元素const_iterator
:指向容器中存放元素的常量迭代器,只能读取容器中的元素。reverse_iterator
:指向容器中存放元素的反向迭代器,用于反向遍历容器中的元素const_reverse_iterator
:指向容器中存放元素的常量反向迭代器,只能读取容器中的元素迭代器的常用运算:
++
:正向移动迭代器--
:反向移动迭代器*
:返回迭代器所指的元素值迭代器类似于指针,如果迭代器到达了容器中最后一个元素的后面,则迭代器变成一个特殊的值,就好像NULL或未初始化的指针一样
一个STL容器就是一种数据结构
顺序容器按照线性次序的位置存储数据。
向量容器相当于数组,它存储具有相同类型的一组元素,它可以从末尾快速地插入与删除元素,快速地随机访问元素,但是在序列中间插入、删除元素较慢,因为需要移动插入或删除位置后面的所有元素
定义方式如下
//定义元素为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,引用容器的第一个元素前面的一个位置 它所有元素为字符类型,类似于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,否则返回1append(cstr)
:在当前字符串的末尾添加一个字符串strinsert(size_type idx, const string& str)
:在当前字符串的idx处插入一个字符串strfind(string& s, size_type pos)
:从当前字符串中的pos位置开始查找字符串s的第一个位置,找到后返回其位置,若没有找到返回-1replace(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个字符双端队列容器由若干个块构成,每个块中元素的地址是连续的,块之间的地址是不连续的,系统有一个特定的机制将这些块构成一个整体。所以空间的重新分配比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)
:在队头插入元素elempush_back(elem)
:在队尾插入元素elempop_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容器插入元素比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个元素eleminsert(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中没有相同关键字的元素,在向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()
:用于反向迭代,返回容器中第一个元素前面的一个位置集合中的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()
:用于反向迭代,返回容器中第一个元素前面的一个位置适配器容器是指基于其他容器实现的容器,在底层容器的基础上实现适配器容器的功能
栈容器的默认底层容器是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
和数据结构中的队列一样,具有先进先出的特点,不允许顺序遍历
empty()
:判断队列容器是否为空size()
:返回队列容器中的实际元素个数front()
:返回队头元素back()
:返回队尾元素push(elem)
:元素elem入队pop()
:元素出队优先队列是一种具有受限访问操作的存储结构,元素可以以任意顺序进入优先队列。出队顺序将出队列中优先级最高的元素。
主要成员函数如下:
empty()
:判断优先队列容器是否为空size()
:返回优先队列容器中的实际元素个数top()
:返回队头元素push(elem)
:元素elem入队pop()
:元素出队