C++ 常用STL大全 ccf适用

这是本人从网上整理到个人笔记的内容,现发表到博客上记录,希望能给刚开始学习C++编程的同学提供帮助。如有侵权立刻删除。

C++ STL

目录

目录

顺序容器

vector 向量

list 双向链表

deque 双端队列

关联容器

map 字典

set 集合

容器适配器

stack 栈

queue 队列

C++ iterator 迭代器

不同容器的迭代器


*注意事项*

在用任何容器进行删除操作的时候,应当格外小心迭代器失效的问题。不同容器对元素删除产生的后果不尽相同,但是大部分情况下会出现当前甚至所有迭代器失效的情况。如果进行删除操作,需确保完成后迭代器的指向仍正确。

顺序容器

一种各元素之间有顺序关系的线性表,每个元素有固定的位置,容器不会根据元素特点来排序,保留了操作元素时的逻辑顺序。

vector 向量

特点

        •可以从后方快速的插入和删除,并且能直接访问任何元素(随机访问迭代器)

用法

        •初始化

vector<int> vec;  //vec为空
vector<int> vec2(vec1);  //用vec1初始化vec2
vector<int> vec(iterator1,iterator2)  //用迭代器中间的部分初始化
vector<int> vec(10);  //初始含有10个值为0的元素
vector<int> vec(10,1);  //初始含有10个值为1的元素

        •方法

vector.push_back(var);  //尾部插入元素
vector.pop_back();  //删除尾部元素
vector.size();  //返回所含元素个数(int)
vector.empty();  //返回是否为空(bool)
vector.insert(iterator,n,num);  //在iterator指向的位置插入n个值为num的元素
vector.erase(iterator1,iterator2);  //删除iterator1到iterator2(不包括iterator2)之间的元素,其他元素位置前移
vector.clear();  //清空元素

                •遍历

                •下标遍历(随机访问迭代器)•迭代器法

list 双向链表

特点

        •双链表,从任意地方快速插入与删除(双向迭代器)

用法

        •初始化

list<int> lis;  //默认创建空list
list<int> lis1(lis2);  //用lis2初始化lis1
list<int> lis(iterator1,iterator2);  //同上
list<int> lis(10);  //含有10个元素的list
list<int> lis(10,1);  //含有10个元素1的list

        •方法

list.push_back(var);  //在尾端插入元素
list.pop_back();  //删除末尾值
list.size();  //返回元素个数(int)
list.empty();  //返回是否为空
list.insert(iterator,n,num);  //在iterator指向的位置插入n个值为num的元素
list.erase(iterator1,iterator2);  //删除迭代器12之间的元素
list.clear();  //清空元素
list.front();  //返回第一个元素的引用
list.back();  //返回最后一个元素的引用
list.remove(var);  //清除所有与其重复的元素
list.unique();  //删除相邻重复元素
list.sort();  //排序

        •遍历

                •迭代器法

deque 双端队列

特点

        •从前后快速插入,可以直接访问任何元素(随机访问迭代器)

用法

        •和[[#vector 向量|vector 向量]]用法基本相同,增加了push_front(var)可以从头部插入元素

关联容器

非线性的二叉树结构,由红黑树实现。提供了根据元素特点自动排序的功能,加快了获取元素的速度。

map 字典

特点

        •一对多映射,查找十分快速,但是不允许重复的键出现(双向迭代器)

用法

        •初始化

map<int,string> m;  //空map
map<int,string> m1(m2);  //用m2初始化m1

        •用法

map[key] = value;  //插入/修改元素
map.insert(pair<var,var> (key,value));  //插入元素
map.size();  //返回map元素个数(int)
map.empty();  //返回map是否为空(bool)
map.find(key);  //查找元素,返回指向该元素的迭代器,如果没有该元素则返回指向map.end()的迭代器
map[key];  //根据键取得值
iterator->first;  //根据迭代器取得键
iterator->second;  //根据迭代器取得值
map.erase(iterator);  //根据迭代器删除元素
map.erase(key);  //根据键删除元素
map.clear();  //清空map

        •遍历

                •迭代器法

set 集合

特点

        •查找非常迅速,但是不允许重复的元素出现(双向迭代器)

用法

        •同[[#map 字典||map 字典]]的用法,只是访问元素的方法是* iterator。当set存储的是结构体的化,也可以用iterator->来访问结构体内部对应的数据。

容器适配器

让一种已经存在的容器类型以另一种不同给工作方式运作。

stack 栈

特点

        •后进先出,先进后出(无迭代器)

用法

        •初始化

stack<int> s;  //默认生成空栈
stack<int> s1(s2);  //用s2初始化s1

        •用法

stack.push(val);  //向栈顶压入元素
stack.pop();  //弹出栈顶元素
stack.top();  //返回栈顶元素的引用 !!栈不能为空
stack.empty();  //返回栈是否为空(bool)
stack.size();  //返回栈内元素数量
stack1.swap(stack2);  //交换两个stack内容
stack<int>().swap(stack1);  //清空stack1

        •遍历

                •无法遍历,只能一个个弹出,需注意栈弹空后出错的问题

queue 队列

特点

        •先进先出,后进后出(无迭代器)

用法

        •和[[#stack 栈|stack 栈]]基本相同,pop()弹出的是最先进入的元素•front()和back(),返回第一个和最后一个元素的引用,如果queue为空,则返回值是未定义的

C++ iterator 迭代器

特色

C++ 的迭代器是最简单的,它没有新形式的接口,和指针的行为非常相似,也支持自增操作。

使用

定义分类

        •正向迭代器 iterator

        •反向迭代器 reverse_iterator

        •常量正向迭代器 const_iterator //不可修改其指向的元素

        •常量反向迭代器 const_reverse_iterator //不可修改其指向的元素

声明方法

容器类名::迭代器类型 迭代器名;

功能分类

•单向迭代器 可以使用++it , it++ , * it 等操作。可以互相赋值,可以用 == 比较

•正向 使用++操作等同访问下一个元素•反向 使用++操作等同访问上一个元素

•双向迭代器 支持单项迭代器的全部功能,此外还支持 -- 操作•随机访问迭代器 支持双向迭代器的全部功能,并且迭代器it还可以支持+= , -= ,+int , -int , it[i] (返回it后面第i个元素) 的功能

•随机访问迭代器也支持< , > , <= , >=的比较,也支持两个随机访问迭代器it1-it2的操作,返回值为it2和it1所指向的元素序号只差(it2和it1之间元素个数减1)

辅助函数

==需要头文件#include <algorithm>==

- advance(it, n);  //将迭代器it向前或向后移动n个元素
- distance(it1, it2);  //返回两个元素间的距离,如果调用时it1在it2后方则会进入死循环 ^^^^^^^
- iter_swap(it1, it2);  //交换两个迭代器it1\it2指向的值

不同容器的迭代器

STLiterator
vector随机访问
deque随机访问
list双向
set/multiset双向
map/multimap双向
stack不支持迭代器
queue不支持迭代器
priority_queue不支持迭代器
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值