【模板】数据结构之STL常用容器

标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。虽说它主要表出现到C++中,但在被引入C++之前该技术就已经存在了很长时间。STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用。

一、vector(向量) 

//变长数组,倍增的思想,定义在<vector>,底层为顺序表(数组)

注:系统为某一程序分配空间时,所需时间与空间大小无关,与申请次数有关

std::vector<T> vec;创建T类型元素的vector容器
int size()const返回元素个数
bool empty()返回是否为空,如果空返回true,否则返回false
void clear()清空
ref front()/back()返回第一个/最后一个元素的引用
iterator begin()/end()返回指向容器中第一个元素/最后一个元素位置后一位置的迭代器
void push_back(const T& x)/pop_back()在序列尾部添加/删除一个元素
iterator insert(iterator it,const T&x)向量中迭代器指向元素前增加一个元素x
iterator erase(iterator it)删除向量中迭代器指向元素
iterator erase(iterator first,iterator last)删除向量中[first,last)中元素
operator[]重载了[]运算符,支持像数组一样的随机存取
支持比较运算,按字典序
//遍历向量
for(int i=0;i<vec.size();i++)//下标访问
    cout<<vec[i];
vector<int>::iterator it;//可以只用auto
for(it=vec.begin();it!=vec.end();it++C)//迭代器访问tt
    cout<<*it;
for(auto t:vec)//自动访问,C++11新增特性,在C++14中还允许for(t:vec)
    cout<<t;

 二、pair(对)

//关联式容器,键值对,定义在<utility>

pair<T1,T2>p();创建T类型元素的pair容器
first/second第一/二个元素
pair1.swap(pair2)交换 pair1 和 pair2 的键值对
 支持<、<=、>、>=、==、!=运算,以first为第一关键字,以second为第二关键字(字典序)

三、string(字符串)

//定义在<string>

string s创建字符串对象
int size()/length()返回字符串长度
bool empty()判断是否为空
void clear()清空字符串
const char* c_str()返回字符串所在字符数组的起始地址
string& insert (size_t pos, const string& str);在 string 字符串中pos位置(下标)插入str
string& erase (size_t pos = 0, size_t len = npos);删除 string 中的一个起始下标pos,len长度的子串
string substr (size_t pos = 0, size_t len = npos) const;pos为提取子串的起始下标,len为提取子串长度
size_t find (const string& str, size_t pos = 0) const;
size_t find (const char* s, size_t pos = 0) const;
str为待查找的子串,pos为开始查找的位置(下标)
int find_first_of(const string& str)查找子串和主串公共字符在主串中首次出现的位置
//重载>> << [] + +=
cout<<str;
cin>>str;
str[i];
str1+str2/str1+=str2;

四、queue(队列)

//定义在<queue>

std::queue<T>que()创建T类型元素的queue容器,()初始化
queue(const queue &que);拷贝构造函数
bool empty()判空
void push(const T& x)在queue尾部添加一个元素引用
void pop()删除队首元素
T& front()返回queue队首元素引用
T& back()返回queue队尾元素引用

五、priority_queue(优先队列,默认是大根堆)

//定义在<queue>

std::priority_queue<T>p_que创建T类型元素的priority_queue容器
priority_queue(const p_queue &que);拷贝构造函数
int size()返回元素个数
bool empty()判空
void push(T x)/(T&& x)根据既定的排序规则,将元素 obj 的副本存储/移动到 priority_queue 中适当的位置。
T& top()返回 priority_queue 中第一个元素的引用
void pop()弹出队首元素
priority_queue<int,vector<int>,greater<int>>q;//定义成小根堆的方式

 、deque(双端队列)

//定义在<deque>,底层为循环队列

deque<T>dque创建T类型元素的deque容器
int size()返回元素个数
bool empty()判空
void clear()清空
ref front()/back()返回队首/队尾元素引用
void push_back(T x)/pop_back(T x)弹出队头/队尾元素
void push_front(T x)/T pop_front(T x)插入x到队头/队尾
iterator begin()/end()返回指向容器中第一个元素/最后一个元素位置后一位置的迭代器
opreator[]随机存取

七、stack(栈)

//定义在<stack>

stack<T>stk创建T类型元素的stack容器
int size()返回元素个数
bool empty()判空
void push(T x)从栈顶插入元素
void pop()弹出栈顶元素
T top()返回栈顶元素

八、set(集合),multiset(允许元素重复),unordered_set(未排序的集合),unordered_multiset

//定义在<set><unordered_set>,s基于平衡二叉树(红黑树),动态维护有序序列,us基于哈希表

int size()返回元素个数
void empty()判重
void clear()清空
iterator begin()/end()返回指向容器中第一个元素/最后一个元素位置后一位置的迭代器
operator++ --返回前驱和后继,时间复杂度O(logn) (ordered)
void insert(const T& x)插入x
iterator find(T x)查找x,返回指向x的双向迭代器
int count(T x)返回x的个数
void erase(T x)/(iterator it)删除所有x O(k+logn)/删除it
lower_bound(T x)/upper_bound(T x)返回>=x/>x的最小数的迭代器(ordered)

注:unordered_set 增删改查的时间复杂度是O(1)

for(set<int>::iterator it=st.begin();it!=st.end();it++)//遍历set
		cout<<*it<<" ";

九、map(散列表),multimap(一key对多value),unorder_map(未排序的散列表),unordered_multimap

//定义在<map><unordered_map>,底层红黑树/哈希表

int size()返回元素个数
bool empty()判空
void clear()清空
iterator begin()/end()

返回指向容器中已排好序的第一个/最后一个键值对的双向迭代器。

operator++ --返回前驱和后继 O(logn)
void insert(pair<T> p)插入一个T类型pair
void erase(pair<T> p)/(iterator it)删除键值对p或it指向元素
iterator find(T x)查找x,返回指向x的双向迭代器
operator[]随机存取,multimap不支持此操作 O(logn),访问失败会插入新key
void at(int k)找到 key 键对应的值,如果找不到,该函数会引发 out_of_range 异常。
lower_bound()/upper_bound()返回>=x/>x的最小数的迭代器(ordered)

注:unordered_map 增删改查的时间复杂度是O(1)

for(auto it : map1){//c++11
	cout << it.first <<" "<< it.second <<endl;
}

十、bitset(压位)

//定义在...

bitset<cnt> s创建cnt大小的bitset
int count()返回有多少个1
bool any()判断是否至少有一个1
bool none()判断是否全为0
void set()把所有位置变成1
void set(int k,int v)将第k位变成v
void reset()把所有位变成0
void flip()等价于~,按位取反
void flip(int k)把第k位取反
~,&,|,^,>>,<<,==,!=,[]//重载运算符

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值