标准模板库STL的核心设计思想是将容器(类模板)与算法(函数模板)分开,使用迭代器封装访问容器元素的方法,容器所支持的迭代器类型决定了容器适用的算法。
注1:STL设计基于前闭后开区间,end表示末端元素的下一位置
注2:仿函数(functors)是增加了可配置性(类型泛化)和可配接性(算法函数的函数适配器)的函数指针
注3:Struct iterator_traits通过class template partial specialization使得无是论原生指针还是class-type iterators都可以方便地获取迭代器I的相关型别(associated type):
- typename iterator_traits:: value_type 容器中存储元素的类型
- typename iterator_traits:: difference_type 引用相同容器的两个迭代器之间的距离
- typename iterator_traits:: pointer 指向迭代器所指对象的指针
- typename iterator_traits:: reference 迭代器所指对象的引用
- typename iterator_traits:: iterator_category 迭代类型(只读、只写、单向、双向、随机访问) 常用category:iterator随机访问
Vector
一维vector初始化
#include
#include
int main ()
{
// constructors used in the same order as described above:
std::vector first; // empty vector of ints
std::vector second (4,100); // four ints with value 100
std::vector third (second.begin(),second.end()); // iterating through second
std::vector fourth (third); // a copy of third
// the iterator constructor can also be used to construct from arrays:
int myints[] = {16,2,77,29};
std::vector fifth (myints, myints + sizeof(myints) / sizeof(int) );
std::cout << "The contents of fifth are:";
for (std::vector::iterator it = fifth.begin(); it != fifth.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
二维vector初始化
大小:
std::vector> v(5, std::vector(6))//相当于int v[5][6]
大小和初值:
//相当于 int v[5][6]={0}
std::vector> v(5, std::vector(6, 0))
大小和不同的初值:
using namespace std;
int x[2][3] = {{1, 2, 3}, {4, 5, 6}};
vector> v(2, vector(3));
for(int i = 0; i < 2; i++){
for(int j = 0; j < 3; j++){
v[i][j] = x[i][j];
}
}
push_back
pop_back
- 注意pop_back()的返回值为void,要获取最后一个元素应使用back()
front
back
at
emplace
insert
iterator insert (iterator position, const value_type& val); //指向插入位置
void insert (iterator position, size_type n, const value_type& val);
void insert (iterator position, InputIterator first, InputIterator last);
erase
iterator erase (iterator position);
iterator erase (iterator first, iterator last); //指向最后删除后第一个位置
- erase不能根据值删除
- insert 注意Vector的动态增加大小是以原大小的两倍重新配置另外一块空间,因此任何引起空间重新配置的操作,例如备用空间可能不足的insert,会使指向原vector的所有迭代器失效
#include
#include
int main ()
{
std::vector myvector (3,100);
std::vector::iterator it;
it = myvector.begin();
it = myvector.insert ( it , 200 );
//[200,100,100,100]
myvector.insert (it,2,300);
//[300,300,200,100,100,100,100]
// "it" no longer valid, get a new one:
it = myvector.begin();
std::vector anothervector (2,400);
myvector.insert (it+2,anothervector.begin(),anothervector.end());
int myarray [] = { 501,502,503 };
myvector.insert (myvector.begin(), myarray, myarray+3);
std::cout << "myvector contains:";
for (it=myvector.begin(); it
- 重新分配大小
void resize (size_type n, value_type val = value_type());
void reserve (size_type n);
判断当前capacity 按需改变
List
List是一个双向链表,它的实现只需一个link_type的node指针便可表示整个环状双向链表。按照STL前闭后开的区间原则,node指针指向刻意置于尾端的一个空白节点,这样begin()只需返回(link_type)((*node).next),end()直接返回node即可。
List的元素操作
remove:移除数值为value的所有元素
unique:移除数值相同的连续元素
splice:将某连续范围的元素从一个list移动到另一个或同一个list的某个定点
reverse:全部翻转
merge:合并两个已经递增排序的list
sort:list不能使用STL排序算法,只能使用自己的sort成员函数,因为STL排序算法只接受随机访问迭代器。
stack
基于deque或list实现,不提供迭代器
push
pop
top
emplace
queue、priority_queue
头文件均为#include
queue基于deque实现,不提供遍历功能,不提供迭代器
push
pop
front
back
emplace
priority_queue基于内部数据结构heap实现,不提供遍历功能,不提供迭代器
push
pop
top
emplace
set、map、multimap、multiset
基于内部数据结构RB-tree实现,因此会根据元素键值自动排序,对数平均时间复杂度
insert
emplace
erase
find
begin
end
count
lower_bound: >=
upper_bound: >
equal_range: [ )
unordered_map、unordered_multimap、unordered_set、unordered_multiset
基于内部数据结构hash_table实现,常数平均时间复杂度,最坏O(N)
除上述方法外还有bucket_count、max_bucket_count等。
bitset, 圧位
bitset<位数> s;
~, &, |, ^
, <<
==, !=
[]
count() 返回有多少个1
any() 判断是否至少有一个1
none() 判断是否全为0
set() 把所有位置成1
set(k, v) 将第k位变成v
reset() 把所有位变成0
flip() 等价于~
flip(k) 把第k位取反