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]);