STL概述
STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。
STL是由容器、对象、算法、迭代器、函数对象、适配器、内存分配等六部分构成。
STL容器,即封装好的数据结构方法,如插入链表的操作等。STL 提供有 3 类标准容器,分别是序列容器、排序容器和哈希容器,其中后两类容器有时也统称为关联容器。
容器类别 | 主要特性 |
---|---|
序列容器 | 包括array数组容器、vector向量容器、list列表容器以及deque双端队列容器。序列容器即无序容器 |
排序容器 | 包括set集合容器、multiset多重集合容器、map映射容器以及multimap多重映射容器。排序容器中的元素默认从小到大排序。 |
哈希容器 | C++11中新加入的四种关联式容器。暴力unordered_set哈希集合、unordered_multiset哈希多重集合、unordered_map哈希映射以及unordered_multimap哈希多重映射。哈希容器中的元素位置由哈希函数决定 |
STL头文件共13个
<list> <map> <deque> <set> <iterator> <vector> <queue>
<stack> <algorithm> <memory> <functional> <numeric> <utility>
vector容器的基本操作如下
一、vector初始化操作
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int>::iterator i;
// vector<int> v{1,2,3,4,5};//c++98标准不支持 直接初始化,要用函数进行插值
//vector初始化方法
//1、定义空的vector
vector<int> v_empty;
//2、定义长为5且所有元素初始化为2
vector<int> v_const(5,2);
//3、定义并指定初始长度,默认初始所有元素为0
vector<int> v(10);
//4、利用出入函数对vector进行初始化赋值
for(int i=0;i<10;i++){
v_empty.push_back(i);
}
//vector在指定位置插入元素,insert(迭代器,数值)
v_empty.insert(v_empty.begin(),10);
//在vector中值为8的位置前插入88
for(i=v_empty.begin();i<v_empty.end();i++){
if(*i==5){
v_empty.insert(i,88);
break;
}
}
//使用erase()删除指定元素 erase(迭代器)
// v_empty.erase(v.begin()); 直接使用begin和end函数会报错
//在指定位置删除元素 ,删除元素5
for(i=v_empty.begin();i<v_empty.end();i++){
if(*i==5){
v_empty.erase(i);
break;
}
}
//删除末尾元素
v_empty.pop_back();
//清空操作
// v_empty.clear();
//返回容器大小
cout<<v_empty.size()<<endl;
//利用迭代器i遍历vector并输出
for(i=v_empty.begin();i<v_empty.end();i++) {
cout<<*i<<" ";
}
return 0;
}
二、其他常用函数
vector.size() 返回元素实际个数
vector.capacity() 返回容器当前容量
vector.assign() 用心元素替换原有内容
vector.reserve() 增加容器的容量
注:vector在使用reserve()使容器容量变化之后,首个元素的存储地址发生了改变,因此,每当 vector 容器的容量发生变化时,都要对之前创建的迭代器重新进行初始化
三、vector访问元素操作
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int>::iterator i;
vector<int> v_empty;
for(int i=0;i<10;i++){
v_empty.push_back(i);
}
//利用迭代器i遍历vector并输出
//1、利用迭代器访问vector元素
for(i=v_empty.begin();i<v_empty.end();i++) {
cout<<*i<<" ";
}
cout<<endl;
//2、利用vector下标访问元素
cout<<v_empty[6]<<endl;
//3、利用vector自带函数front()、back()访问/修改头尾元素
cout<<"front()访问头元素:"<<v_empty.front()<<endl;
cout<<"back()访问尾巴元素:"<<v_empty.back()<<endl;
v_empty.front()=50;
v_empty.back()=55;
cout<<"vector的新头元素为:"<<v_empty.front()<<endl;
cout<<"vector的新尾元素为:"<<v_empty.back()<<endl;
//4、利用at()访问元素
cout<<"利用at()访问元素:"<<v_empty.at(4)<<endl;
//若下标越界会提示报错信息
// cout<< v_empty.at(11)<<endl;
//5、利用data()返回指向容器中首个元素的指针
cout<<"data()返回vector首地址:"<<v_empty.data()<<endl;
cout<<"data()返回vector首地址数值:"<<*v_empty.data()<<endl;
cout<<"data()返回vector任意位置数值:"<<*(v_empty.data()+3)<<endl;
return 0;
}
四、删除元素操作
#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;
int main(){
vector<int>::iterator i;
vector<int> v_empty;
for(int i=0;i<10;i++){
v_empty.push_back(i);
}
//利用迭代器i遍历vector并输出
//1、利用迭代器访问vector元素
for(i=v_empty.begin();i<v_empty.end();i++) {
cout<<*i<<" ";
}
cout<<endl;
//删除元素操作
//1、pop_back()删除vector的最后一个元素,vector的size减1,capacity不变
v_empty.pop_back();
for(i=v_empty.begin();i<v_empty.end();i++) {
cout<<*i<<" ";
}
cout<<endl;
//2、erase(pos)删除指定位置的元素,size减1,capacity不变
for(i=v_empty.begin();i<v_empty.end();i++) {
if(*i==2){
v_empty.erase(i);
}
}
for(i=v_empty.begin();i<v_empty.end();i++) {
cout<<*i<<" ";
}
cout<<endl;
//3、clear()删除所有元素,size变为0,capacity不变
v_empty.clear()
return 0;
}
基于pop_back()、clear()、erase()删除元素操作都不会改变vector的容量,因此在for循环进行元素遍历时应使用size属性(动态改变)。
五、emplace_back()和push_back()的区别
同:都是在vector尾部添加元素
异:底层实现机制不同。push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。emplace_back() 的执行效率比 push_back() 高
参考博文:http://c.biancheng.net/view/6826.html