一、关联容器
元素是排序的
插入任何元素,都按相应的排序规则来确定其位置
在查找时具有非常好的性能
通常以平衡二叉树方式实现,插入和检索的时间是o(log(N))
*set/multiset 头文件<set>
set即集合。set中不允许有相同的元素,multiset中允许有相同的元素
*map/multimap 头文件<map>
二、顺序容器和关联容器都有的成员函数
begin: 返回指向容器中第一个元素的迭代器
end: 返回指向容器中最后一个元素后面的位置的迭代器
rbegin: 返回指向容器中最后一个元素的迭代器
rend: 返回指向容器中第一个元素前面的位置的迭代器
erase: 从容器中删除一个或几个元素
clear: 从容器中删除所有元素
三、顺序容器的常用成员函数
front:返回容器中第一个元素的引用
back:返回容器中最后一个元素的引用
push_back(const T& x):在容器末尾中添加新元素
pop_back:删除容器末尾的元素
erase(interator pos):删除迭代器指向的元素(可能会使该迭代器失效)或删除一个区间,返回被删除元素后面的那个元素的迭代器(pos从1算起)
四、迭代器
用于指向顺序容器和关联容器中的元素
迭代器用法和指针相似
有const和非const两种
通过迭代器可以读取它指向的元素
通过非const迭代器还能修改其指向的元素
五、vector(顺序容器)
1、向量类成员函数原型:
(1)----迭代器iterator----
和前面第二部分内容一样
(2)----容量capacity----
size_type size()//返回向量元素数目
size_type max_size()//返回向量能容纳的最大元素数目
void resize(siez_type sz,T c=T())//重置向量长度为sz,c填充到扩充元素中
size_type capacity() //返回向量容器存储空间大小
bool empty()//测试向量是否为空
void reserve(size_type n)//为向量申请能容纳n个元素的空间
(3)----元素存取----
operator [](size_type n)//返回向量第n个位置元素的运算符,n从0起
at(size_type n)//返回向量第n个位置,n从0起
(4)----向量调节器modifiers----
void assign(size_type n,const T& u)//向量赋n个u值
void insert(iterator pos,size_type n,const T& x)//在向量pos处插入n个元素值x,pos从1起
void swap(vector<T,Allocator>& vec)//与向量vec互换元素
2、下面这段代码是用vector实现二维数组
vector<vector <int> >v(3);//v有三个元素,每个元素都是vector<int>容器
for(int i=0;i<v.size();i++)
for(int j=0;j<4;j++)
v[i].push_back(j);
for(int i=0;i<v.size();i++)
{
for(int j=0;j<v[i].size();j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
3、vector的构造函数
vector() //无参构造函数
vector(size_type num,const type & val) //构造一个初始放入num个值为val的元素的Vector
vector(const vector & form) //构造一个与vector from 相同的vector,其实这个是拷贝构造函数
vector(input_iterator start,input_iterator end) // 构造一个初始值为[start,end)区间元素的Vector(注:半开区间).
构造函数的使用示例:
第一种:
#include<iostream>
#include<vector>
using namespace std;
int main() {
//定义一个使用无参构造的vector
vector<int> test;
}
第二种:
int main() {
//建立一个含有10个1 的vector
vector<int> test(10,1);
}
第三种:
int main() {
//建立一个含有10个1 的vector
vector<int> test(10,1);
//使用拷贝构造函数,构建一个test的复制品
vector<int> copy(test);
}
第四种:
int main() {
//建立一个含有10个1 的vector
vector<int> test(10,1);
//使用两个迭代器指定的范围内的容器的值来初始化copy
//至于cbegin和cend后续会介绍
vector<int> copy(test.cbegin(),test.cend());
}
所有适用于vector的操作都适用于deque,但是deque还有push_front(将元素插入到前面)和pop_front(删除最前面的元素)操作,复杂度是o(1)
六、list(双向链表)
在模板里面定义这种类型不确定的容器上面的迭代器,前面要加一个typename
比如:
typename list<T>::const_iterator i;//typename用来说明list<T>::const_iterator i是个类型