文章目录
- STL基本概念
- 使用STL的好处
- 容器
- vector
- 1.vector容器简介
- 2.vector对象的默认构造函数
- 3.vector对象的带参构造函数
- 4.vector的赋值
- 5.vector的大小
- 6.vector容器的访问方式
- 7.vector的插入
STL基本概念
- STL(Standard Template Library,标准模板库)
- STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator)
- 迭代器:算法通过迭代器访问容器里面的数据
- 容器和算法之间通过迭代器进行无缝连接。
- STL 几乎所有的代码都采用了模板类或者模板函数,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会
使用STL的好处
- STL是C++的一部分,因此不需要额外安装什么,被内建在你的编译器里面
- STL的一个重要特点是将数据结构和算法分离
- 程序员不用思考STL的实现过程
- STL具有高可用性,高性能,高移植,跨平台优点
容器
序列式容器:
- 序列式容器每个元素都有固定位置–取决于插入的时机和地点,和元素值无关。
- vector,deque、list、stack、queue
关联式容器:
- 元素位置取决于特定的排序准则,和插入顺序无关
- set、multiset、map、multimap
vector
1.vector容器简介
- 尾部插入速度比较快
- vector是将元素置于一个动态数组中加以管理的容器
- vector可以随机存取元素(支持索引值直接存取)
- vector尾部添加或移除元素的速度非常快速,但是在头部插入或移除元素比较费时
2.vector对象的默认构造函数
vector<class T>vecT;
vector<int>vecInt;
vector<float>vecFloat;
vector<string>vecString;
class A{};
vector<A>vecA; //用于存放CA对象的vector容器,
//由于容器元素的存放是按值复制的方式进行,所以此时CA必须提供CA的拷贝构造函数,以保证CA对象间拷贝正常
vector<A*>vecpA; //用于存放CA对象指针的vector容器
3.vector对象的带参构造函数
理论知识:
- vector(beg,end); //构造函数将[beg,end)区间中的元素拷贝给本身,注意该区间左闭右开
- vector(n,elem);//构造函数将n个elem拷贝给本身
- vector(const vector& vec); //拷贝构造函数
int main()
{
int arr[] = { 1,2,3,4,5 }; //用两个指针构造
vector<int>v1(arr, arr + 5);
vector<int>v2(3, 10);//存储3个10
for (int i = 0; i < v2.size(); i++)
{
cout << v2[i] << " ";
}
cout << endl;
vector<int>v3(v1);//用一个已经构造好的对象初始化新的对象
for (int i = 0; i < v1.size(); i++)
{
cout << v3[i] << " ";
}
}
4.vector的赋值
- vector.assign(beg,end);//将[beg,end)区间中的元素拷贝赋值给本身,注意该区间左闭右开
- vector.assign(n,elem);//将n个elem拷贝赋值给本身
- vector& operator=(const vector& vec);//重载等号操作符
- vector.swap(vec); //将vec与本身的元素互换
int main()
{
vector<int>vecIntA(3, 10);
vector<int> vecIntB, vecIntC, vecIntD;
int iarray[] = { 0,1,2,3,4 };
//将数组iarray中的所有元素赋值给vactorIntA容器
vecIntA.assign(iarray, iarray + 5);
cout << "A:";
for (int i = 0; i < vecIntA.size(); i++)
{
cout <<vecIntA[i] << " ";
}
cout << endl;
//将vecIntA中所有元素赋值给vecIntB
vecIntB.assign(vecIntA.begin(), vecIntA.end());
cout << "B1:";
for (int i = 0; i < vecIntB.size(); i++)
{
cout <<vecIntB[i] << " ";
}
cout << endl;
cout << "B2:";
vecIntB.assign(vecIntA.begin()+2, vecIntA.end()-1);
for (int i = 0; i < vecIntB.size(); i++)
{
cout << vecIntB[i] << " ";
}
cout << endl;
//将4个10拷贝到vecIntC
vecIntC.assign(4, 10);
cout << "C:";
for (int i = 0; i < vecIntC.size(); i++)
{
cout<< vecIntC[i] << " ";
}
cout << endl;
//互换元素
vecIntB.swap(vecIntC);
cout << "B2:";
for (int i = 0; i < vecIntB.size(); i++)
{
cout <<vecIntB[i] << " ";
}
cout << endl;
cout << "C:";
for (int i = 0; i < vecIntC.size(); i++)
{
cout << vecIntC[i] << " ";
}
cout << endl;
//重载赋值运算符
vecIntD = vecIntC;
cout << "D:";
for (int i = 0; i < vecIntD.size(); i++)
{
cout << vecIntD[i] << " ";
}
return 0;
}
5.vector的大小
- vector.size(); //返回容器中元素的个数
- vector.empty(); //判断容器是否为空
- vector.resize(); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除
- vector.resize(num,elem);//重新指定容器的长度为num,若容器变长,则以elem填充新位置。如果容器变短,则末尾超出容器长度的元素被删除
int main()
{
vector<int>v1;
cout << "v1.size: " <<v1.size()<< endl;
if (v1.empty()) //判断容器是否为空
{
cout << "v1 is empty" << endl;
}
int array[] = { 1,2,3,4,5 };
v1.assign(array, array + 5);
//将容器的长度变长
v1.resize(10);
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;
//将容器长度变短
v1.resize(3);
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;
//将容器长度变长,并且扩展出来的新的元素为指定的值
v1.resize(10, 100);
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;
return 0;
}
6.vector容器的访问方式
- vec.at[idx]; //返回索引idx所指数据,如果idx越界,抛出out_of_range异常
- vec[idx]; //返回索引idx所指的数据,越界时,运行直接报错
7.vector的插入
- 在vector末尾进行插入:push_back、在末尾删除元素:pop_back
- vector.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置
- vector.insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值
- vector.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值
int main()
{
int arr[] = { 1,2,3,4,5 };
vector<int>v1(arr, arr + 5);
//在末尾插入函数
v1.push_back(10);
//在末尾删除函数
v1.pop_back();
//在指定位置插入一个指定元素
v1.insert(v1.begin()+3,100); //注意第一个参数不能为下标,应该为指针
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;
//在指定的位置插入多个元素
v1.insert(v1.begin() + 3, 3, 1000);//在下标为3的位置上插入3个1000
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;
//将指定的区间中的元素插入到指定的位置上,将50—80插入
int b[] = { 40,50,60,70,80,90 };
v1.insert(v1.begin() + 7, b + 1, b + 5);
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;
}