c++修炼之路之vector--标准库中的vector
目录
接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧
前言
vector是表示一个可变大小的数组的容器,就和数组,顺序表一样,使用连续的空间来存储数据,访问数据,它的使用更加方便高效
一:vector的简介
对于vector简单来说就是一个可变大小的顺序表,就像数组一样,可以使用数组的下标来访问数据,当要新插入数据时,就要新开辟一个数组,将源数组内容 拷贝过去,在完成插入操作等
使用时要包含头文件#include <vector>
二:vector的常用接口
1.构造函数
对于构造函数和string有不同的是 vector可以使用一段迭代器区间来构造
演示代码如下
#include <iostream>
using namespace std;
#include <vector>
#include<string>
int main()
{
vector<int> v1;//无参构造
for (auto c : v1)
{
cout << c << " ";
}
cout << endl;
vector<int> v2(10, 1);//n个val来构造
for (auto c : v2)
{
cout << c << " ";
}
cout << endl;
vector<int> v3(v2.begin(), v2.end());//使用一段迭代器区间来构造
for (auto c : v3)
{
cout << c << " ";
}
cout << endl;
string str("Hello world");
vector<int> v4(str.begin(), str.end());//使用一段迭代器区间来构造,可以是任意类型的一段迭代器区间
for (auto c : v4)
{
cout << c << " ";
}
cout << endl;
vector<int> v5(v3);//拷贝构造
for (auto c : v5)
{
cout << c << " ";
}
cout << endl;
return 0;
}
2.迭代器访问遍历数组
这里用迭代器来遍历数组就和string的一样,主要掌握正向反向迭代器,const对象的使用的const迭代器,有了迭代器就可以使用范围for来遍历数组,这里的迭代器依旧可以理解为指针遍历数组
演示代码如下
vector<int> v1(10, 1);
//三种遍历方式
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;
vector<int>::iterator it = v1.begin();
while (it != v1.end())
{
cout << *it << " ";
++it;
}
cout << endl;
vector<int>::reverse_iterator rit = v1.rbegin();//反向迭代器
while (rit != v1.rend())
{
cout << *rit << " ";
++rit;
}
cout << endl;
for (auto c : v1)
{
cout << c << " ";
}
cout << endl;
3.容量接口函数
对于reserve只是开空间,对于vs是1.5倍扩容,而g++是2倍扩容,如果提前知道要开辟的空间有多大的话,可以使用reserve提前开空间减少扩容带来的消耗,只改变capacity
对于resize是开空间+初始化,改变size,如果resize要开的空间小于size的话,相当于删除数据,但capacity不改变;resize要开的空间大于capacity的话,size和capacity都改变
代码演示
vector<int> v;
v.reserve(50); // size = 0 capacity 50
v.resize(100,1); // size = 100 capacity 100
cout << v.size() << endl;
cout << v.capacity() << endl;
4.增删查改接口函数
特别注意尤其对于insert和erase都存在迭代器失效的问题,对于vs是直接报错的,在模拟实现中详细介绍原因和解决办法
代码演示
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
v1.push_back(5);
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;
v1.pop_back();
for (auto c : v1)
{
cout << c << " ";
}
cout << endl;
//insert和erase要结合find函数共同完成操作
//vector<int>::iterator pos = find(v1.begin(), v1.end(), 3);
auto pos = find(v1.begin(), v1.end(), 3);
if (pos != v1.end())
{
v1.insert(pos,4);//3前面插入4
}
for (auto c : v1)
{
cout << c << " ";
}
cout << endl;
pos= find(v1.begin(), v1.end(), 3);
if (pos != v1.end())
{
v1.erase(pos);//删除pos位置的值
}
for (auto c : v1)
{
cout << c << " ";
}
cout << endl;
三:vector常用接口的全部代码
https://gitee.com/lin-ciyu/cplusplus/blob/master/vector/vector/testcpp.cpp
四:对于vector的常用接口函数的介绍就到这里了,但vector的使用还是较重要的,遇到忘记的接口了,去查查标准文档理解理解就足够了
原文地址:https://blog.csdn.net/Miwll/article/details/137746797
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!