一、容器的定义
在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种“对象”还包含了一系列处理“其它对象”的方法。
二、容器的种类
- 顺序容器: 是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。顺序容器包括:vector(向量)、list(列表)、deque(队列)。
- 关联容器: 关联式容器是非线性的树结构,更准确的说是二叉树结构。各元素之间没有严格的物理上的顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。但是关联式容器提供了另一种根据元素特点排序的功能,这样迭代器就能根据元素的特点“顺序地”获取元素。元素是有序的集合,默认在插入的时候按升序排列。关联容器包括:map(集合)、set(映射)、multimap(多重集合)、multiset(多重映射)。
- 容器适配器: 本质上,适配器是使一种不同的行为类似于另一事物的行为的一种机制。容器适配器让一种已存在的容器类型采用另一种不同的抽象类型的工作方式实现。适配器是容器的接口,它本身不能直接保存元素,它保存元素的机制是调用另一种顺序容器去实现,即可以把适配器看作“它保存一个容器,这个容器再保存所有元素”。STL 中包含三种适配器:stack (栈)、队列queue(队列)和priority_queue(优先级队列) 。
三、不同容器的使用方法
1、vector(需要包含头文件# include < vector > )
(1)初始化
vector<int> vec1; //默认初始化,vec1为空
vector<int> vec2(vec1); //使用vec1初始化vec2
vector<int> vec3(vec1.begin(),vec1.end());//使用vec1初始化vec2
vector<int> vec4(10); //10个值为0的元素
vector<int> vec5(10,4); //10个值为4的元素
vector<string> vec6(10,"null"); //10个值为null的元素
vector<string> vec7(10,"hello"); //10个值为hello的元素
(2)常用操作方法
vector::front //访问第一个元素,返回对向量中第一个元素的引用;
vector::back //访问的最后一个元素,返回对向量中最后一个元素的引用;
vector::begin //返回指向向量中第一个元素的迭代器(iterator);
vector::end //返回一个迭代器(iterator),该迭代器引用向量容器中的结束符元素;
vector::push_back //在向量的末尾添加一个新元素;
vector::pop_back //删除最后一个元素;
vector::size //返回向量中元素的个数;
vector::insert(iterator) //插入元素,通过在指定位置元素或元素范围的之前插入新元素;
vector::erase(iterator) //从向量中删除单个元素(位置)或元素范围([first,last]);
vector::empty //返回该向量是否为空,bool类型;
vector::clear //从向量中移除所有元素;
vector::sort //sort(myvector.begin(), myvector.end());
2、list(需要包含头文件# include < list > )
(1)初始化
list<int> lst1; //创建空list
list<int> lst2(3); //创建含有三个元素的list
list<int> lst3(3,2); //创建含有三个元素为2的list
list<int> lst4(lst2); //使用lst2初始化lst4
list<int> lst5(lst2.begin(),lst2.end()); //同lst4
(2)常用操作方法
list::front //访问第一个元素;
list::back //访问的最后一个元素;
list::begin //返回指向列表容器中第一个元素的迭代器(iterator);
list::end //返回一个迭代器(iterator),该迭代器引用列表容器中的结束后元素;
list::push_back //在末尾添加元素;
list::push_front //在列表的开头插入一个新元素,就在它当前的第一个元素之前;
list::pop_back //删除最后一个元素;
list::pop_front //删除第一个元素;
list::empty //返回列表容器是否为空,bool类型;
list::erase //从列表容器中删除单个元素(位置)或元素范围([first,last]);
list::insert //插入元素,通过在指定位置元素或元素范围的之前插入新元素;
list::sort //容器中的排序元素;
list::merge //合并排序的列表;
list::size //返回列表容器中的元素数量;
list::unique //删除相邻重复的值;
list::remove(val) //删除具有特定值的元素;
3、deque(需要包含头文件# include < deque > )
deque容器类与vector类似,支持随机访问和快速插入和删除,与vector不同,deque还支持从开始端插入数据和删除数据:push_front/pop_front。其余的类似vector操作方法的使用。
4、map/unordered_map
- map:map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素,因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行这样的操作,故红黑树的效率决定了map的效率;
- unordered_map: unordered_map内部实现了一个哈希表,因此其元素的排列顺序是杂乱的,无序的;
这里就总结unordered_map: #include< map >
常用操作方法:
unordered_map::begin //返回一个迭代器,该迭代器指向unordered_map容器的第一个元素;
unordered_map::clear //将删除unordered_map容器中的所有元素;
unordered_map::count(k) //在容器中搜索键为k的元素,并返回找到的元素数量。因为unordered_map容器不允许重复键,这意味着如果容器中存在具有该键的元素,则函数实际上返回1,否则返回0;
unordered_map::empty //返回一个bool值,该值指示unordered_map容器是否为空;
unordered_map::end //返回一个迭代器,该迭代器指向unordered_map容器的结束后元素;
unordered_map::erase //从unordered_map容器中删除单个元素或元素范围([first,last]);
unordered_map::find //查找一个元素,如果找到,则返回一个迭代器,否则将返回一个迭代器到unordered_map::end(容器末尾的元素);
unordered_map::insert //在unordered_map中插入新元素,只有当每个元素的键不等同于容器中已经存在的任何其他元素的键时,才会插入该元素(unordered_map中的键是惟一的);
unordered_map::size //返回unordered_map容器中的元素数量;
unordered_map::swap //交换内容,size可能不同;
5、set/unordered_set #include< set >
这里总结set:
常用操作总结:
set::begin //返回一个迭代器,该迭代器引用集合容器中的第一个元素;
set::clear //从集合容器中删除所有元素;
set::count(val) //在容器中搜索与val等价的元素,并返回匹配的数量;由于集合容器中的所有元素都是惟一的,因此函数只能返回1(如果找到元素)或0(否则);
set::empty //返回集合容器是否为空(即大小是否为0);
set::end //返回一个迭代器,该迭代器引用集合容器中的结束后元素;
set::erase //从集合容器中移除单个元素或元素范围([first,last]);
set::find //在容器中搜索与val等价的元素,如果找到,则返回一个迭代器,否则返回一个要set::end的迭代器;
set::insert //通过插入新元素扩展容器,通过插入的元素数量有效地增加容器大小;由于集合中的元素是惟一的,插入操作检查每个插入的元素是否与容器中已有的元素等价,如果是,则不插入该元素,将迭代器返回到该现有元素(如果函数返回值);
set::size //返回集合容器中的元素数量;
set::swap //交换内容;
6、stack :#include < stack >
常用方法总结:
stack::empty //返回堆栈是否为空:即堆栈大小是否为零;
stack::pop //移除堆栈顶部的元素;
stack::push //在堆栈顶部插入一个新元素,该元素位于当前顶部元素之上;
stack::size //返回堆栈中元素的数量;
stack::swap //交换内容;
stack::top //返回对堆栈顶部元素的引用;
7、queue: #include < queue >
常用方法总结:
queue::back //访问的最后一个元素;
queue::empty //返回队列是否为空:即队列大小是否为零;
queue::front //返回最早被压入队列的元素;
queue::pop //弹出队列的第一个元素,注意,并不会返回被弹出元素的值;
queue::push //队列的最后一个元素后面插入一个新元素;
queue::size //返回队列中元素的数量;
queue::swap //交换内容;