vector容器
vector的数据安排以及操作方式,与array非常相似,两者的唯一差别在于空间的运用的灵活性。Array是静态空间,一旦配置了就不能改变,要换大一点或者小一点的空间,可以,一切琐碎得由自己来,首先配置一块新的空间,然后将旧空间的数据搬往新空间,再释放原来的空间。
Vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。因此vector的运用对于内存的合理利用与运
使用vector需要引入头文件vector,并且属于std命名空间内
vector是一个模板类,在创建vector变量时,需要使用<>定义容器内值的类型
#include <vector>
int main(){
std::vector<int> v;
}1.vector的遍历
1.1 迭代器
begin()和end()函数是vector实例对象上的函数
- begin():指向一个
vector容器首个值的位置 - end():指向一个
vector容器最后一个值的下一个位置
需要使用vector中的iterator定义一个迭代器指针来指向begin()返回的位置
使用push_back()向vector容器后面添加一个元素
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v;
v.push_back(1);
vector<int>::iterator it = v.begin(); // 指向首元素的地址
cout << *it; // 1,首元素的值
return 0;
}1.2 迭代器遍历
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << ","; // 1,2,3,4,5,
}
return 0;
}因为每次循环的循环遍历是个指针,指向每次循环中容器中的值,所以我们可以通过*it修改容器中的值
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
*it = *it + 1;
}
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << ","; // 2,3,4,5,6
}
return 0;
}倒叙遍历
for (vector<int>::iterator it = v.end(); it != v.begin();) {
it--;
cout << *it << ",";
}1.3 元素迭代遍历
语法
for(vector元素类型 循环遍历: vector遍变量){
cout <<ele;
}和遍历数组一样
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
for (int ele : v) {
cout << ele << ","; // 1,2,3,4,5
}
return 0;
}若想在循环中修改循环遍历的值,需要使用引用
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
for (int& ele : v) {
ele++;
}
for (int& ele : v) {
cout << ele << ","; // 2,3,4,5,6
}
return 0;
}封装成函数供后续使用
void printVector(vector<int> &v) {
for (int& ele : v) {
cout << ele << ",";
}
}2.vector构造函数
2.1 无参构造函数
创建一个空的vector变量
vector<int> v;2.2 创建指定数量值
创建一个vector变量,里面填充了n个值,每个值都为ele
若ele不穿,则每个值都是0
vector<int> v(n, ele);2.3 拷贝构造函数
需要根据一个已有的vector变量来创建另一个vector变量
vector<int> v;
vector<int> v1(const vector& v);2.4 根据已有变量截取
vector<int> v(start, end);- start:指向已有vector变量的位置,作为新vector变量的开始值
- end:指向已有vector变量的位置,作为新vector变量的结束值
vector<int> v(10, 5);
vector<int> v1(v.begin(), v.end()) // 把v中的数据,复制到v1中
vector<int> v2(v.begin(), v.begin()+3); // 把v中的前三个数据,复制到v1中3.vector的赋值
3.1 assign()
3.1.1 assign(beg, end)
将[beg, end)区间中的数据拷贝赋值给本身,beg, end为指针
vector<int> v;
v.assign(beg, end);将一个vector容器中的值赋值给另一个vector容器
int main() {
vector<int> v1(10,5);
vector<int> v2;
v2.assign(v1.begin(), v1.begin() + 3); // 赋值前三个值
printVector(v2); // 5,5,5
}将数组中的值赋值给vector容器
int main() {
int arr[] = { 1,2,3,4,5 };
vector<int> v;
v.assign(arr, arr + 5);
printVector(v);
return 0;
}3.1.2 assign(n, ele)
将n个ele拷贝给本身,相当于构造函数 vector<int> v(n, ele);
vector<int> v;
v.assign(10, 5); // 赋值10个53.2 vector的 = 重载
可以把一个vector容器直接赋值给另一个vector容器
int main() {
vector<int> v(5,10);
vector<int> v1 = v;
printVector(v1); // 10,10,10,10,10
return 0;
}直接赋值一个数组
int main() {
vector<int> v = {1,2,3,4,5};
printVector(v); // 1,2,3,4,5
return 0;
}3.3 swap()
交换两个vetcor中的值
int main() {
vector<int> v = { 1,2,3,4,5 };
vector<int> v1 = { 6,7,8,9,10 };
v1.swap(v);
printVector(v); // 6,7,8,9,10,
printVector(v1); // 1,2,3,4,5,
return 0;
}4.vector的大小操作
4.1 size()
size()函数用来获取vector容器里实际存放元素的数量
int main() {
vector<int> v(5,10);
cout << v.size(); // 5
return 0;
}4.2 empty()
判断容器是否为空,返回bool
int main() {
vector<int> v;
cout << v.empty(); // 1
v.assign(5, 10);
cout << v.empty(); // 0
return 0;
}4.4 capacity()
返回容器的容量在内存上开辟了多少个空间
4.5 resize()
resize(size, ele)- size:重新指定的长度
- ele:若新长度大于原来的长度,给新元素填充的内容,若新长度小于原来的长度,则此参数没有意义
若新长度小于原来的长度,则保留容器之前指定数量的元素,后面的元素不可见
int main() {
vector<int> v(5,10);
printVector(v); // 10,10,10,10,10
v.resize(3);
printVector(v); // 10,10,10
return 0;
}若新长度大于原来的长度,则后面的元素默认填充为0,也可以指定填充内容
int main() {
vector<int> v(5,10);
printVector(v); // 10,10,10,10,10
v.resize(10);
printVector(v); // 10,10,10,10,10,0,0,0,0,0,
v.resize(15,6); // 指定填充内容
printVector(v); // 10,10,10,10,10,0,0,0,0,0,6,6,6,6,6,
return 0;
}5.vector的数据存取操作
5.1 at(int index)
返回指定下标的内容
int main() {
vector<int> v = {1,2,3,4,5};
cout << v.at(0) << endl; // 1
cout << v.at(1) << endl; // 2
cout << v.at(2) << endl; // 3
cout << v.at(3) << endl; // 4
cout << v.at(4) << endl; // 5
return 0;
}5.2 [] 运算符重载
可获取指定下标的内容
int main() {
vector<int> v = {1,2,3,4,5};
cout << v[0] << endl; // 1
cout << v[1] << endl; // 2
cout << v[2] << endl; // 3
cout << v[3] << endl; // 4
cout << v[4] << endl; // 5
return 0;
}5.3 front()
返回容器中第一个元素
int main() {
vector<int> v = {1,2,3,4,5};
cout << v.front() << endl; // 1
return 0;
}5.4 back()
返回容器中最后一个元素
int main() {
vector<int> v = { 1,2,3,4,5 };
cout << v.front() << endl; // 1
cout << v.back() << endl; // 5
return 0;
}6.vector的插入和删除
6.1 insert()
指定位置插入指定数量元素,注意参数不是下表,而是迭代器指针
insert(const_iterator pos, int count, ele);- pos:迭代器指向位置插入
- count:元素个数
- ele:元素的值
int main() {
vector<int> v = { 1,2,3,4,5 };
v.insert(v.begin() + 1, 5, 0); //1,0,0,0,0,0,2,3,4,5,
printVector(v);
return 0;
}6.2 push_back()
容器尾部插入一个元素
push_back(ele);- ele:插入元素的值
int main() {
vector<int> v = { 1,2,3,4,5 };
v.push_back(200);
printVector(v); // 1,2,3,4,5,200
return 0;
}6.3 pop_back()
容器尾部删除一个元素
int main() {
vector<int> v = { 1,2,3,4,5 };
v.pop_back();
printVector(v); // 1,2,3,4
return 0;
}6.4 erase()
删除迭代器指定范围的元素
erase(const_iterator start, const_iterator end);- start:删除范围元素的开始位置
- end:删除范围元素的结束位置
删除迭代器指定位置的元素
erase(const_iterator pos);- pos:指定元素的位置
int main() {
vector<int> v = { 1,2,3,4,5 };
v.erase(v.begin(), v.begin()+2); // 3, 4, 5,
printVector(v);
vector<int> v1 = { 1,2,3,4,5 };
v1.erase(v1.begin() + 3);
printVector(v1); // 1,2,3,5
return 0;
}6.5 clear()
删除容器中所有元素
int main() {
vector<int> v = { 1,2,3,4,5 };
v.clear();
printVector(v); // 空
return 0;
}