STL序列容器之vector
一,vector容器简介
1.vector容器的原理
vector是将元素置于一个动态数组中加以管理的容器。
2.vector容器的特点
vector容器可以随机存取元素,支持索引存取(即用数组下标的方式存取)。vector容器在尾部插入和删除数据比较快,但是在中部或者头部插入或者删除元素比较费时。
3.vector容器的使用
vector容器对应得头文件:# include<vector>
二,vector容器的构造函数
1.vector的无参构造函数
// 定义一个存放int类型的向量容器 vector<int> v1; // 定义存放一个double类型的向量容器 vector<double> v2; // 定义一个存放string类型的向量容器 vector<string> v3; // 定义一个存放自定义类型的向量容器,该类型必须提供拷贝构造函数,因为容器的存放是按值复制的方式 vector<Student> v4;
2.vector的有参构造函数
// 使用数组初始化vector int array[] = { 1,2,3,4,5,6,7,8,9 }; vector<int> v1(array, array + 5); // 使用vector初始化vector vector<int> v2(v1.begin(), v1.begin() + 3); // 使用n个相同的元素初始化vector vector<char> v3(10, 'A');
3.vector的拷贝构造函数
// 使用n个相同的元素初始化vector vector<char> v1(10, 'A'); // 拷贝构造函数 vector<char> v2 = v1;
4.vector的析构函数
vector的析构函数和用来释放容器中元素所占用的内存。
三,操作符重载函数
1.赋值操作符
// 定义向量v1 vector<char> v1(10, 'A'); // 定义向量v2 vector<char> v2; // 赋值操作符重载 v2 = v1;
2.数组下标操作符
// 创建vector容器 vector<char> v; // 添加元素到vector中 v.push_back('A'); v.push_back('B'); v.push_back('C'); v.push_back('D'); // 获取第二个元素 char c2 = v[2]; // 修改第二个元素 v[2] = 'X';
四,成员函数
1.vector的尾部添加和尾部删除操作
// vector的尾部添加元素 vector<char> v1; v1.push_back('A'); v1.push_back('B'); v1.push_back('C'); v1.push_back('D'); // vector的尾部删除元素 v1.pop_back(); v1.pop_back();
2.vector获取头部和尾部元素
// 创建vector容器 vector<char> v1; // 往vector插入元素 v1.push_back('A'); v1.push_back('B'); v1.push_back('C'); v1.push_back('D'); // 获取vector的头元素和尾部元素 char first = v1.front(); char last = v1.back();
3.vector的长度
// 定义vector容器 vector<int> v1(10,1); // 获取vector的长度 int v1_size = v1.size();
4.vector是否为空及清空元素操作
// 创建vector容器 vector<int> v1(10,1); // 判断vector容器是否为空 bool isEmpty = v2.empty(); // vector容器的元素清空 v2.clear();
5.vector元素的获取和修改
// 创建vector容器 vector<char> v; // 添加元素到vector中 v.push_back('A'); v.push_back('B'); v.push_back('C'); v.push_back('D'); // 获取第二个元素 char c2 = v[2]; // 获取第三个元素 char c3 = v.at(3); // 修改第二个元素 v[2] = 'X';
6.vector的遍历
// 创建vector容器 vector<int> v1(10,2); // 增强for遍历 for (int tmp : v1) { cout << tmp << " "; } cout << endl; // 迭代器正向遍历 for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++) { *it += 1; cout << *it << " "; } cout << endl; // 迭代器逆向遍历 for (vector<int>::reverse_iterator it = v1.rbegin(); it != v1.rend(); it++) { cout << *it << " "; } cout << endl;
7.vector的插入
// 创建vector容器 vector<char> v(10, 'A'); // 在vector容器的第二个位置插入字符'X' v.insert(v.begin() + 2, 'X'); // 在vector容器的最后位置插入5个'B' v.insert(v.end(), 5, 'B');
8.vector的删除
// 创建vector容器 vector<char> v; // 存入数据 v.push_back('A'); v.push_back('B'); v.push_back('C'); v.push_back('D'); v.push_back('E'); // 删除第2个元素 v.erase(v.begin() + 1); // 删除最后两个元素 v.erase(v.end() - 2, v.end());
9.vector的遍历删除
# include<iostream> # include<vector> # include<deque> 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); v.push_back(6); // 这里注意不需要++it for (vector<int>::iterator it = v.begin(); it != v.end();) { // 删除偶数 if (*it % 2 == 0) { // erase删除该元素后返回下一个元素的迭代器 it = v.erase(it); } else { it++; } } // 遍历 for (int tmp : v) { cout << tmp << " "; } cout << endl; return 0; }
五,vector容器添加自定义数据类型
1.定义老师类
#pragma once # include<iostream> using namespace std; /* 定义老师类 */ class Teacher { private: char * name; int age; public: Teacher(); Teacher(char * name, int age); /* 如果往容器中存入数据,必须定义拷贝构造函数 */ Teacher(const Teacher& teacher); ~Teacher(); public: friend ostream& operator<<(ostream& out, Teacher& teacher); };
2.老师类的实现
# define _CRT_SECURE_NO_WARNINGS # include<iostream> # include"Teacher.h" using namespace std; /* 无参构造 */ Teacher::Teacher() { this->name = NULL; this->age = 0; } /* 有参构造 */ Teacher::Teacher(char * name, int age) { this->name = new char[strlen(name)+1]; strcpy(this->name, name); this->age = age; } /* 拷贝构造函数 */ Teacher::Teacher(const Teacher& teacher) { this->name = new char[strlen(teacher.name)+1]; strcpy(this->name, teacher.name); this->age = teacher.age; } /* 析构函数 */ Teacher::~Teacher() { if (this->name != NULL) { delete [] this->name; this->name = NULL; this->age = 0; } } /* 友元函数:重载左移操作符 */ ostream& operator<<(ostream& out, Teacher& teacher) { cout << teacher.name << " = " << teacher.age; return out; }
3.向量容器存入老师对象
# include<iostream> # include<vector> # include"Teacher.h" using namespace std; int main() { // 定义容器 vector<Teacher> v; // 定义5个老师对象 Teacher t1("刘备", 56); Teacher t2("关羽", 45); Teacher t3("张飞", 34); Teacher t4("赵云", 30); Teacher t5("马超", 25); // 存入向量容器 v.push_back(t1); v.push_back(t2); v.push_back(t3); v.push_back(t4); v.push_back(t5); // 遍历 for (Teacher t : v) { cout << t << endl; } return 0; }