2 vector容器
array是静态空间,一旦配置了就不可以更改,要更改则需要配置新空间,然后进行赋值。而vector容器是一个动态数组,可以动态的增加和删除元素,内部机制会自动扩充空间以容纳新元素。使用时需要引入#include "vector"
2.1 vector容器的遍历
// vector容器的遍历
void test1() {
// 1. 构造一个vector对象,通过vector的无参构造,构造一个空的vector容器
vector<int> v;
// 2. 添加元素
v.push_back(10);
v.push_back(20);
v.push_back(30);
// 3. 遍历vector容器,使用迭代器
// 迭代器:使用普通指针,依次指向vector中的每一个元素
// begin():获取到的是vector容器中的首元素的地址
// end():获取到的是vector容器中的最后一位元素的下一位指针
// vector<int>::iterator it = v.begin();
// cout << "vector容器的遍历:" << *it << endl;
// it++; // 指针后移,注意:越界输出会报错
// cout << "vector容器的遍历:" << *it << endl;
for (vector<int>::iterator it = v.begin(); it != v.end(); it++){
cout << "vector容器的遍历:" << *it << endl;
};
for (vector<int>::iterator it = v.begin(); it != v.end(); it++){
if (*it == 20){
*it = 200;
};
cout << "vector遍历时修改值:" << *it << endl;
};
// 迭代器遍历时缩写
// 依次将v容器中的每一个元素,给ele进行赋值
// 注意:是赋值,所以改变ele的值,不会影响v容器中的元素,如果要修改v容器中的元素,要引用&
for (int ele:v){
cout << ele << endl;
}
// 遍历、缩写、引用、修改值
for (int &ele:v){
if(ele == 10){
ele = 100; // 这样修改的值才会影响v容器中的元素
}
}
// 倒序遍历
for (vector<int>::iterator it = v.end();it != v.begin();){
it--;
cout << "vector容器的遍历倒序:" << *it << endl;
}
}
2.2 vector容器的构造函数
// vector容器的构造函数
void test2(){
// 1. 通过vector的无参构造,构造一个空的vector容器
vector<int> v1;
// 2. vector(n, ele) 使用n个ele填充容器
vector<int> v2(5, 100);
printVector(v2);
// 3. vector(const vector& v), 拷贝构造函数
// 4. vector(v.begin(), v.end()) 左闭右开
vector<int> v3(v2.begin(), v2.end()); // 将v2容器中从begin->end中的元素拷贝到v3容器中
printVector(v3);// 注意:end()指向的是最后一个元素的下一个位置,元素从0开始
vector<int> v4(v2.begin(), v2.begin()+4); // 将v2容器中前4个元素拷贝到v4容器中
printVector(v4);
int array[] = {1, 2, 3, 4, 5};
vector<int> v5(array, array+3);
// array是0位置的地址,array+3是3位置的地址,由于end()指向的是最后一个元素的下一个元素,所以v5容器中实际有的是0 1 2这三个位置的元素
// 也可以说成是将array数组的前3个元素拷贝到v5容器中,上面的同理
printVector(v5);
// 注意:指针加1,指的是指针向后偏移一个位置,不是单纯的地址的值加1,减同理。
}
2.3 vector容器的赋值操作
// vector的常用赋值操作
void test3(){
// assign(beg, end); 将[beg, end)区间中的数据拷贝赋值给本身
// assign(n, ele); 将n个ele拷贝赋值给本身
// vector& operator = (const vector & vec); // 重载的等号赋值运算符
// swap(vec); 交换两个vector容器的元素
int array[] = {1, 2, 3, 4, 5};
// vector构建
vector<int> v1;
v1.assign(array, array+3); // array是数组的首元素的地址,array+3是数组的第4个元素的地址,左闭右开
printVector(v1);
vector<int> v2;
v2.assign(3,10);
printVector(v2);
vector<int> v3;
v3 = v2; // 使用重载后的等号运算符=
printVector(v3);
cout << "交换前:" << endl;
printVector(v1);
printVector(v2);
v1.swap(v2);
cout << "交换后:" << endl;
printVector(v1);
printVector(v2);
}
2.4 vector的大小操作
//vector 的大小操作
void test4(){
vector<int> v(10,5);
// 返回容器中元素个数
cout << "容器中元素个数:" << v.size() << endl;
// 判断容器是否为空
cout << "容器是否为空:" << v.empty() << endl;
// 返回容器容量
cout << "容器容量:" << v.capacity() << endl;
// 重新指定长度,不是指定容器的容量,而是容器中元素的个数,如果容器长度不够,会进行扩容
v.resize(20); // 如果新长度大于原来长度,则用默认值填充,也可以指定填充值,如v.resize(20, 100);
cout << "resize,新的长度>原来长度" << endl;
cout << "容器中元素个数:" << v.size() << endl;
cout << "容器容量:" << v.capacity() << endl;
// 如果新长度小于原来长度,则多余的元素被删除;
v.resize(4); // 如果新长度大于原来长度,则用默认值填充,也可以指定填充值,如v.resize(20, 100);
cout << "resize,新的长度<原来长度" << endl;
cout << "容器中元素个数:" << v.size() << endl;
cout << "容器容量:" << v.capacity() << endl;
// 运行发现,容器中元素是4个,容量是20,怎么让它一致呢?
// 创建一个新的空容器,将v容器中的元素拷贝到新容器中,然后交换两个容器,v指向新容器,匿名函数指向旧容器,运行完会自动回收空间
// 拷贝构造新容器时,新容器的容量是跟元素数量一致的,所以容量=元素个数
vector<int>(v).swap(v); // swap收缩空间
cout << "容器中元素个数:" << v.size() << endl;
cout << "容器容量:" << v.capacity() << endl;
}
2.5 vector的数据存取
// vector的存取
void test5(){
// at(int idx); // 返回索引idx所指的数据,如果idx大于容器中实际元素个数,则抛出异常
// operator[]; 返回索引idx所指的数据,如果idx大于容器中实际元素个数,则抛出异常
// front(); 返回容器中第一个数据元素,即0号位元素
// back();返回容器中最后一个数据元素
int array[] = {1, 2, 3, 4, 5,6,7,8,9,10};
vector<int> v(array,array+sizeof(array)/sizeof(array[0]));
int& ele = v.at(2); // 引用
cout << v.at(2) << endl;
ele = 100; // 修改会对v容器中的元素进行修改
cout << v.at(2) << endl;
printVector(v);
int& ele2 = v[2];
cout << v[2] << endl;
ele2 = 200;
printVector(v);
cout << v.front() << endl;
cout << v.back() << endl;
}
2.6 vector的插入和删除
// vector的插入和删除
void test6(){
int array[] = {1, 2, 3, 4, 5,6,7,8,9,10};
vector<int> v(array,array+sizeof(array)/sizeof(array[0]));
// insert(const_iterator pos, int count, ele); // 迭代器指向位置pos插入count个元素ele
// push_back(ele); // 在容器尾部插入元素ele
// pop_back(); // 删除容器中最后一个元素
// erase(const_iterator start, const_iterator end); // 删除迭代器[start, end)区间的元素
// erase(const_iterator pos); // 删除迭代器指向的元素
// clear(); // 删除容器中所有元素
v.insert(v.begin()+3,2, 100); // 在容器的3位置处插入2个100,变成了1, 2, 3, 100, 100, 4, 5……
printVector(v);
v.push_back(100); // 在容器尾部插入元素100
printVector(v);
v.pop_back(); // 删除容器中最后一个元素
printVector(v);
v.erase(v.begin()+3, v.begin()+5); // 删除容器中3和4位置的元素,不包括5,先闭后开
printVector(v);
v.erase(v.begin()+3); // 删除容器中3位置的元素
printVector(v);
v.clear(); // 删除容器中所有元素
// printVector();
}