vector
是 S T L STL STL 提供的 内存连续的、可变长度 的数组数据结构。能够提供线性复杂度的插入和删除,以及常数复杂度的随机访问。
①vector
:定义一个 v e c t o r / v e c t o r vector/vector vector/vector 数组。
②vector
:将前 t t t 位赋值为 n n n。
vector<int> a(4,-3);//输出结果:-3 -3 -3 -3
front()
:返回第一个数
back()
:返回最后一个数
push_back()
:向最后插入一个数
pop_back()
:把最后一个数删掉
//迭代器遍历
for(vector<int>::iterator i=a.begin();i!=a.end();i++)cout<<*i<<" ";
for(auto i=a.begin();i!=a.end();i++)cout<<*i<<" ";
//auto遍历,C++11
for(auto x:a)cout<<x<<" ";
//size遍历
for(int i=0;i<a.size();i++)cout<<a[i]<<" ";
[]
:随机访问,和数组一样。
deque
是 S T L STL STL 提供的双端队列数据结构,能够提供线性复杂度的插入和删除,以及常数复杂度的随机访问。
front()
:返回队首元素
back()
:返回队尾元素
push_back()
:向队尾插入元素
pop_back()
:弹出队尾元素
puch_front()
:向队首插入元素
pop_front
:弹出队首元素
[]
:随机访问,和数组一样。
set
是关联容器,含有键值类型对象的已排序集,搜索、移除和插入拥有对数复杂度。set
内部通常采用红黑树实现。平衡二叉树的特性使得 set
非常适合处理需要同时兼顾查找、插入与删除的情况。
(1)set
:不能有重复元素,插入重复元素将会忽略。
(2)multiset
:可以有重复元素,并记录重复个数。
insert(x)
:插入 x,具体区别看上面。
erase(x)
:删除值为 x 的所有元素,返回删除元素的个数。
erase(pos)
:删除迭代器为 pos 的元素。
erase(first,last)
:删除迭代器在 [ f i r s t , l a s t ) [first,last) [first,last) 范围内的所有元素。
find(x)
:查找 x 返回迭代器,不存在返回 end()
。
count(x)
:返回某一个数的个数,set中只有 0 0 0 和 1 1 1 两种情况,multiset 有多个。
lower_bound(x)
:返回大于等于 x x x 的最小的数的迭代器,不存在返回end()
。
upper_bound(x)
:返回大于 x x x 的最小的数的迭代器,不存在返回end()
。
lower_bound(x) 和 upper_bound(x) 的时间复杂度为 O ( l o g n ) O(log\ n) O(log n)。
algorithm
库中的 lower_bound(x) 和 upper_bound(x) 时间复杂度为 O ( n ) O(n) O(n)。
set
没有提供自带的nth_element
。使用algorithm
库中的nth_element
查找第 大的元素时间复杂度为 O ( n ) O(n) O(n)。
map
是有序键值对容器,它的元素的键是唯一的。搜索、移除和插入操作拥有对数复杂度。map
通常实现为红黑树。
map
其中,Key
是键的类型,T
是值的类型,例如 map
(1)map
:不会存在键相同的元素。
(2)multimap
:允许多个元素拥有同一键。(没有访问方法,一般不用)
可以直接通过下标访问来进行查询或插入操作。例如 mp["Alan"]=100
。
insert(pair)
:插入的是一个 p a i r pair pair,例如 mp.insert(pair
。
erase(Key)
:删除键值为 K e y Key Key 的所有元素,返回删除元素的数量。
erase(pos)
:删除迭代器为 p o s pos pos 的元素。
erase(first,last)
:删除迭代器在 [ f i r s t , l a s t ) [first,last) [first,last) 范围内的所有元素。
find(X)
:若容器内存在键值为 x x x 的元素,返回该元素的迭代器。
count(x)
:返回键值为 x x x 的元素数量。
lower_bound()
:返回大于等于 x x x 的最小的数的迭代器。不存在返回end()
。
upper_bound()
:返回大于 x x x 的最小的数的迭代器。不存在返回end()
。
[]
:随机选址,和数组一样。使用第一个变量查找第二个变量。时间复杂度是 o ( l o g n ) o(logn) o(logn)。
自 C++11 标准起,四种基于哈希实现的无序关联式容器正式纳入了 C++ 的标准模板库中,分别是:unordered_set
,unordered_multiset
,unordered_map
,unordered_multimap
。
和上面类似,增删改查的时间复杂度是 O ( 1 ) O(1) O(1)。不支持lower_bound()/upper_bound()
。迭代器的++,–。
stack
是一种后进先出 (Last In, First Out) 的容器适配器,仅支持查询或删除最后一个加入的元素(栈顶元素),不支持随机访问,且为了保证数据的严格有序性,不支持迭代器。
stack<TypeName> s; //使用默认底层容器 deque,数据类型为 TypeName
stack<TypeName, Container> s; //使用 Container 作为底层容器
stack<TypeName> s2(s1); //将 s1 复制一份用于构造 s2
top()
:返回栈顶元素。
push(x)
:向栈中插入元素 x x x。
pop()
:弹出栈顶元素。
std::queue
是一种先进先出 (First In, First Out) 的容器适配器,仅支持查询或删除第一个加入的元素(队首元素),不支持随机访问,且为了保证数据的严格有序性,不支持迭代器。
queue<TypeName> q; //使用默认底层容器 deque,数据类型为 TypeName
queue<TypeName, Container> q; //使用 Container 作为底层容器
queue<TypeName> q2(q1); //将 s1 复制一份用于构造 q2
front
:返回队首元素。
back()
:返回队尾元素。
push(x)
:向队列中插入元素 x x x。
pop()
:弹出队头元素。
clear
函数,要想清空队列,只能重新构造。q=queue<int>();
可以多加两个参数将默认的大根堆定义为小根堆,还可以在存数的时候将 x x x 存成 − x -x −x,这样也可以反着利用大根堆。头文件还是使用#include
。
//定义大根堆(默认)
priority_queue<int>heap;
//定义小根堆
priority_queue<int,vector<int>,greater<int>>heap;
priority_queue<TypeName> q; // 数据类型为 TypeName
priority_queue<TypeName, Container> q; // 使用 Container 作为底层容器
priority_queue<TypeName, Container, Compare> q;
// 使用 Container 作为底层容器,使用 Compare 作为比较类型
// 默认使用底层容器 vector
// 比较类型 less(此时为它的 top() 返回为最大值)
// 若希望 top() 返回最小值,可令比较类型为 greater
// 注意:不可跳过 Container 直接传入 Compare
// 从 C++11 开始,如果使用 lambda 函数自定义 Compare
// 则需要将其作为构造函数的参数代入,如:
auto cmp = [](const pair<int, int> &l, const pair<int, int> &r) {
return l.second < r.second;
};
priority_queue<pair<int, int>,vector<pair<int, int> >,decltype(cmp)>pq(cmp);
top()
:返回堆顶元素
push(x)
:插入元素 x x x,并对堆进行排序。
pop()
:弹出堆顶元素。PA
=
:有赋值运算符以及复制构造函数。
begin()
:返回指向开头元素的迭代器。
end()
:返回指向末尾的下一个元素的迭代器。end()
不指向某个元素。
size()
:返回容器内的元素个数,返回类型是 u n s i g n e d i n t unsigned\ \ int unsigned int,在使用的时候最后将其转化为 i n t int int。
max_size()
:返回容器理论上能存储的最大元素个数。
empty()
:返回容器是否为空、
swap()
:交换两个容器。
clear()
:清空容器。
== / != / < / > / <= / >=
:按字典序比较两个容器的大小。(无顺序容器不支持< / > / <= / >=
)
set<int>a;
int x;
set<int>::iterator it=a.lower_bound(x);
if(it==a.end()){
//not found
}else{
//找到元素,进行操作。
a.erase(it);
}
bitset
是标准库中的一个存储 0/1
的大小不可变容器。严格来讲,它并不属于 STL。由于内存地址是按字节即 byte
寻址,而非比特 bit
,一个 bool
类型的变量,虽然只能表示 0/1
, 但是也占了 1 byte 的内存。
bitset
就是通过固定的优化,使得一个字节的八个比特能分别储存 8 位的 0/1
。
bitset<N>bs;
bitset<N>bs(x);//将 x 转化为二进制存入。
bitset<N>bs(str);//str为 01 串。
支持各种位运算操作:①~,&,|,^;②>>,<<;③==,!=
[]
:随机访问。
count()
:返回有多少个1
any()
:返回是否至少有一个1
none()
:是否全为0。
set(k,v)
:将第 k k k 位变成 v v v。
set()
:把所有位变成 1 1 1
rset()
:把所有位变成 0 0 0。
flip()
:等价于~
flip(k)
:把第 k k k 位取反。
pair
是标准库中定义的一个类模板。用于将两个变量关联在一起,组成一个“对”,而且两个变量的数据类型可以是不同的。(①first
:第一个元素②second
:第二个元素)
支持 s o r t sort sort 排序:以 f i r s t first first 为第一关键字,以 s e c o n d second second 为第二关键字。
//中间可以使用不同的数据类型
pair<int,strging> p;
//构造一个二元组
p=make_pair(10,"abc");
p={20,"def"}//C++11
//甚至可以用pair存储三个属性
pair<int,pair<int,int>> p;
string
是在标准库
(注意不是 C 语言中的
库)中提供的一个类,本质上是 basic_string
的别称。
string str1,str2="abc";
(2)size()/length()
:字符串长度。(使用 size()
的时候注意转化为 int
)
(3)empty()
:判断是否为空。
(4)clear()
:清空字符串。
(5)可以直接添加字符串
string str="abc";
str+="def";//str=abcdef
(6)substr(a,b)
:截取字符串
将字符串从下标 a a a 开始截取 b b b 个字符(字符串下标从 0 0 0 开始),要是 b b b 超出字符串长度则一直输出到字符串结束为止。substr(a)
:直接从下标 a a a 开始截取完整个字符串。
string str="abcdef";
string a=str.substr(1,3);
string b=str.substr(1,999);
string c=str.substr(3);
//a="bcd"
//b="bcdef"
//c="def"
(7)c_str()
:字符串的起始地址
string str="abcdef";
printf("%s",str.c_str());
//相当于printf("%s",&str[0]);