什么是STL?
STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。在被引入C++之前该技术就已经存在了很长的一段时间。
STL从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器)。容器和算法通过迭代器可以进行无缝地连接。几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
在C++标准中,STL被组织为下面的13个头文 件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack> 和<utility>。
在这里,重点讲述vector。
容器是什么?
容器的概念:用来管理一组元素
容器的分类:
(1)序列式容器
每个元素都有固定位置,它取决于插入时机和地点,和元素值无关。
如: vector、deque、list
(2)关联式容器
元素位置取决于特定的排序准则,和插入顺序无关。
如: set、multiset、map、multimap
什么是迭代器?
(1)迭代器从作用上来说是最基本的部分。
软件设计有一个基本原则,所有的问题都可以通过引进一个间接层来简化, 这种简化在STL中就是用迭代器来完成的。概括来说,迭代器在STL中用来将算法和容器联系起来,起着一种黏和剂的作用。几乎STL提供的所有算法都是通 过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。
(2)迭代器部分主要由头文件<utility>,<iterator>和<memory>组成。
**<utility>是一个很小的头文件,它包括了贯穿使用在STL中的几个模板的声明;
**<iterator>中提供了迭代器使用的许多方法;
**<memory>的描述则十分的困难,它以不同寻常的方式为容器中的元素分配存储空间,同时也为某些算法执行期间产生 的临时对象提供机制;<memory>中的主要部分是模板类allocator,它负责产生所有容器中的默认分配器。
vector:
(1)vector是将元素置于一个动态数组中加以管理的容器。
(2)vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法)。
(3)vector尾部添加或移除元素非常快速。但是在中部或头部插入元素或移除元素比较费时。
(4)vector采用模板类实现,vector对象的默认构造形式
vector<T> vecT;
(5)vector的相关用法:
vector(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。
vector(n,elem); //构造函数将n个elem拷贝给本身。
vector(const vector &vec); //拷贝构造函数
vector.assign(beg,end); //将[beg, end)区间中的数据拷贝赋值给本身。注意该区间是左闭右开的区间。
vector.assign(n,elem); //将n个elem拷贝赋值给本身。
vector& operator=(const vector &vec); //重载等号操作符
vector.swap(vec); // 将vec与本身的元素互换。
vector.size(); //返回容器中元素的个数
vector.empty(); //判断容器是否为空
vector.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器 长度的元素被删除。
vector.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出 容器长度的元素被删除。
vec.at(idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
vec[idx]; //返回索引idx所指的数据,越界时,运行直接报错
vector.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
vector.insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。
vector.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值
vector.clear(); //移除容器的所有数据
vec.erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
vec.erase(pos); //删除pos位置的数据,返回下一个数据的位置。
举例: 注意注释
#include<iostream>
#include<vector>
using namespace std;
void VectorInit() //初始化
{
int array[] = {1,2,3,4,5,6,7,8,9,10};
vector<int> v1;
vector<int> v2(10);
vector<int> v3(array, array + sizeof(array)/sizeof(array[0]));
vector<int> v4(10,10);
for(int i=0;i<v3.size();i++) //小于v3长度 逐个输出
{
cout<< v3[i] <<" ";
}
cout<<endl;
for(int i=0;i<v4.size();i++)
{
cout<< v4[i] <<" ";
}
cout<<endl;
}
void VectorAssign()
{
int array[] = {1,2,3,4,5,6,7,8,9,0};
vector<int> v1(10);
//将括号里区间中的元素拷贝给本身 区间为左闭右开的区间
v1.assign(array, array + sizeof(array)/sizeof(array[0]));
for(int i=0;i<v1.size();i++)
{
cout<< v1[i] <<" ";
}
cout<<endl;
vector<int> v2(10);
//构造函数将10个10拷贝给本身
v2.assign(10, 10);
for(int i=0;i<v2.size();i++)
{
cout<< v2[i] <<" ";
}
cout<<endl;
//直接赋值
v2 = v1;
for(int i=0;i<v2.size();i++)
{
cout<< v2[i] <<" ";
}
cout<<endl;
vector<int> v3(10);
for(int i=0;i<v3.size();i++)
{
v3[i] = i+1;
}
v2 = v3;
for(int i=0;i<v2.size();i++)
{
cout<< v2[i] <<" ";
}
cout<<endl;
//将v1与v3的元素互换
v3.swap(v1);
for(int i=0;i<v3.size();i++)
{
cout<< v3[i] <<" ";
}
cout<<endl;
}
void VectorIterator()
{
vector<int> v1(10);
for(int i=0;i<v1.size();i++)
{
v1[i] = i+1;
}
//正向迭代器
for(vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
{
cout<< *it <<" "; //输出1到10
}
cout<<endl;
//逆向迭代器
for(vector<int>::reverse_iterator rit = v1.rbegin(); rit != v1.rend(); rit++)
{
cout<< *rit <<" "; //输出10到1
}
cout<<endl;
}
void VectorInsert()
{
vector<int> v1(10);
for(int i=0;i<v1.size();i++)
{
v1[i] = i+1;
}
vector<int>::iterator it = v1.begin();
it += 3;
v1.insert(it,100); //从it的位置开始插入一个100的元素
for(it = v1.begin(); it != v1.end(); it++) //正向迭代器
{
cout<< *it <<" ";
}
cout<<endl;
it = v1.begin();
it++;
v1.insert(it,10,20); //从it的位置开始插入[10,20)区间的元素
for(it = v1.begin(); it != v1.end(); it++) //正向迭代器
{
cout<< *it <<" ";
}
cout<<endl;
vector<int> v2(10);
for(int i=0; i < v2.size(); i++)
{
v2[i] = i+20;
}
it = v2.begin();
v1.insert(v1.begin() , it , it+5); //v2前五个插入到v1开头
for(it = v1.begin(); it != v1.end(); it++) //正向迭代器
{
cout<< *it <<" ";
}
cout<<endl;
v2.push_back(1000); //从最后开始插入1000
for(it = v2.begin(); it != v2.end(); it++) //正向迭代器
{
cout<< *it <<" ";
}
cout<<endl;
v2.pop_back(); //将最后一个元素取出
for(it = v2.begin(); it != v2.end(); it++) //正向迭代器
{
cout<< *it <<" ";
}
cout<<endl;
}
void VectorSize()
{
vector<int> v1(10);
for(int i=0;i<v1.size();i++)
{
v1[i] = i+1;
}
v1.resize(20,90); //空间大小为20,不足20的用90来填充
for(vector<int>::iterator it = v1.begin(); it != v1.end(); it++) //正向迭代器
{
cout<< *it <<" ";
}
cout<<endl;
v1.resize(5); //空间大小为5 输出 1 2 3 4 5
for(vector<int>::iterator it = v1.begin(); it != v1.end(); it++) //正向迭代器
{
cout<< *it <<" ";
}
cout<<endl;
}
void VectorErase()
{
vector<int> v1(10);
for(int i=0;i<v1.size();i++)
{
v1[i] = i+1;
}
vector<int>::iterator it = v1.begin();
v1.erase(it+1 , it+8); //从it+1 的位置删除到 it+8
for(vector<int>::iterator it = v1.begin(); it != v1.end(); it++) //正向迭代器
{
cout<< *it <<" ";
}
cout<<endl;
v1.clear();
}
int main()
{
//VectorInit();
//VectorAssign();
//VectorIterator();
//VectorInsert();
//VectorSize();
VectorErase();
return 0;
}