C++ vector的使用
###vector介绍:
vector是C++中引入的类模板,这个模板相当于顺序表,里面可以存放不同类型的数据,同时实现了多个接口去完成对vector对象的各种操作;
基本使用方式:
#include<vector>//包含头文件
using namespace std;//展开头文件中的命名空间
int main()
{
vector<int> v;//定义一个vector对象,这个对象存放的是int类型的数据;
}
一、vector的构造、析构和赋值
1、构造
-
不传参数构造,这个vector中没有数据;
-
第一个参数为数据个数,第二个参数为数据值,完成构造;
-
用已存在的vector去构造另一个vector;
-
用已存在的vector的一部分去初始化;
- 用数组去初始化(两个参数都是指向数组元素的指针,指针之间包含的数据就是要去初始华的数据)。
void test01()
{
//不初始化,v1里面没有数据
vector<int> v1;
cout << "data:";
for (auto i : v1)
{
cout << i << ' ';
}
cout << endl;
//用10个1初始化
vector<int> v2(10, 1);
cout << "data:";
for (auto i : v2)
{
cout << i << ' ';
}
cout << endl;
//用vector去初始化vector
vector<int> v3(v2);
cout << "data:";
for (auto i : v3)
{
cout << i << ' ';
}
cout << endl;
//用vector对象的一部分去初始化(使用迭代器)
vector<int> v4(v3.begin() + 1, v3.end() - 1);
cout << "data:";
for (auto i : v4)
{
cout << i << ' ';
}
cout << endl;
//用数组初始化
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//可以理解为地址的范围中含有的数据
vector<int> v5(arr, arr+sizeof(arr) / sizeof(arr[0]));
cout << "data:";
for (auto i : v5)
{
cout << i << ' ';
}
cout << endl;
}
2、析构
清除所有的元素,并且把vector对象申请的空间释放
3、赋值
将一个vector对象的元素个数,数据值,容量大小赋值给另一个对象,但是两个vector对象的地址不变
二 、迭代器
与string的迭代器类似
void test02()
{
vector<int> v1(10,9);
vector<int>::iterator it = v1.begin();
while (it != v1.end())
{
(*it)++;
cout << *it << " ";
it++;
}
cout << endl;
vector<int>::const_iterator cit = v1.cbegin();//cit指向的数据不能被改变
while (cit != v1.cend())
{
cout << *cit << " ";
cit++;
}
}
三、容量:
vector<int> v1(10, 1);
//size
cout << v1.size() << endl;
//capacity
cout << v1.capacity() << endl;
//empty
cout << v1.empty() << endl;
不为空,empty返回假,0代表假;
reserve在VS里面默认只会扩大,当要reserve的值比vector对象的容量小时,不改变capacity
//reserve
vector<int> v2(10, 9);
v2.reserve(20);
cout << v2.size() << endl;
cout << v2.capacity() << endl;
v2.reserve(5);
cout << v2.size() << endl;
cout << v2.capacity() << endl;
v2.reserve(30);
cout << v2.size() << endl;
cout << v2.capacity() << endl;
resize 改变对象size的值;缩小就相当于从尾部删除数据,增大就从尾部加数据,这些加的数据可以给特定的值:
//resize
vector<int> v3(10, 1);
cout << v3.size() << endl;
cout << v3.capacity() << endl;
for (auto i : v3)
{
cout << i << " ";
}
cout << endl;
v3.resize(5);
cout << v3.size() << endl;
cout << v3.capacity() << endl;
for (auto i : v3)
{
cout << i << " ";
}
cout << endl;
v3.resize(20,9);
cout << v3.size() << endl;
cout << v3.capacity() << endl;
for (auto i : v3)
{
cout << i << " ";
}
cout << endl;
当resize扩大size时,不给特定的值,就默认为0。
四、元素获取
void test04()
{
vector<int> v1(10, 1);
//通过下标访问数据//[]
for (size_t i = 0; i < v1.size(); i++)
{
cout << v1[i] << ' ';
}
cout << endl;
//at
for (size_t i = 0; i < v1.size(); i++)
{
cout <<v1.at(i)<< ' ';
}
cout << endl;
//front back分别获取第一个个最后一个的数据
vector<int> v2(10);
v2[0] = 100;
v2[v2.size()-1] = 999;
cout << v2.front() << endl;
cout << v2.back() << endl;
//data获取vector对象的地址
vector<int> v3(10, 9);
int* p = v3.data();//此时p是v3首个数据的地址
*p = 100;
p++;//第二个数据地址
*p = 200;
p[2] = 400;//p从第二个数据的地址往后加2,就是原数据的第四个数据的地址
for (size_t i = 0; i < v3.size(); i++)
{
cout << v3[i] << ' ';
}
}
五、修改
尾插和尾删
//push_back、pop_back
//尾插和尾删
vector<int> v1(10, 10);
v1.push_back(999);
v1.push_back(888);
v1.pop_back();
for (auto i : v1)
{
cout << i << " ";
}
cout << endl;
insert插入数据,vector里面涉及的insert相比于string更加简洁;这里的position都是迭代器操作的
- 在position位置之前插入数据val;
- 在position位置之前插入n个val数据;
- 在一个vector对象的position位置之前插入另一个vector对象的一段迭代器区间中的数据;
//insert
vector<int> v1(10, 10);
v1.insert(v1.begin()+6, 999);
for (auto i : v1)
{
cout << i << " ";
}
cout << endl;
v1.insert(v1.begin(), 3, 888);
for (auto i : v1)
{
cout << i << " ";
}
cout << endl;
vector<int> v2(10, 6);
v1.insert(v1.begin(), v2.begin() + 5, v2.end());
for (auto i : v1)
{
cout << i << " ";
}
cout << endl;
erase删除一个或者一段数据,通过迭代器实现
//erase
vector<int> v1(10);
for (size_t i = 0; i < v1.size(); i++)
{
v1[i] = i;
}
for (auto i : v1)
{
cout << i << " ";
}
cout << endl;
//删除一个数据
v1.erase(v1.begin());
for (auto i : v1)
{
cout << i << " ";
}
cout << endl;
//删除一段数据
v1.erase(v1.begin(), v1.end() - 5);
for (auto i : v1)
{
cout << i << " ";
}