一,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[] = { ,,,,,,,, };
vector<int> v1(array, array + );
// 使用vector初始化vector
vector<int> v2(v1.begin(), v1.begin() + );
// 使用n个相同的元素初始化vector
vector<char> v3(, 'A');

3.vector的拷贝构造函数

// 使用n个相同的元素初始化vector
vector<char> v1(, 'A');
// 拷贝构造函数
vector<char> v2 = v1;

4.vector的析构函数

  vector的析构函数和用来释放容器中元素所占用的内存。

三,操作符重载函数

1.赋值操作符

// 定义向量v1
vector<char> v1(, '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[];
// 修改第二个元素
v[] = '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(,);
// 获取vector的长度
int v1_size = v1.size();

4.vector是否为空及清空元素操作

// 创建vector容器
vector<int> v1(,);
// 判断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[];
// 获取第三个元素
char c3 = v.at();
// 修改第二个元素
v[] = 'X';

6.vector的遍历

// 创建vector容器
vector<int> v1(,);
// 增强for遍历
for (int tmp : v1)
{
cout << tmp << " ";
}
cout << endl;
// 迭代器正向遍历
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
{
*it += ;
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(, 'A');
// 在vector容器的第二个位置插入字符'X'
v.insert(v.begin() + , 'X');
// 在vector容器的最后位置插入5个'B'
v.insert(v.end(), , '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() + );
// 删除最后两个元素
v.erase(v.end() - , v.end());

9.vector的遍历删除

# include<iostream>
# include<vector>
# include<deque> using namespace std; int main()
{
// 定义容器
vector<int> v;
// 添加数据
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
// 这里注意不需要++it
for (vector<int>::iterator it = v.begin(); it != v.end();)
{
// 删除偶数
if (*it % == )
{
// erase删除该元素后返回下一个元素的迭代器
it = v.erase(it);
}
else {
it++;
}
}
// 遍历
for (int tmp : v)
{
cout << tmp << " ";
}
cout << endl; return ;
}

五,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 = ;
}
/* 有参构造 */
Teacher::Teacher(char * name, int age)
{
this->name = new char[strlen(name)+];
strcpy(this->name, name);
this->age = age;
}
/* 拷贝构造函数 */
Teacher::Teacher(const Teacher& teacher)
{
this->name = new char[strlen(teacher.name)+];
strcpy(this->name, teacher.name);
this->age = teacher.age;
}
/* 析构函数 */
Teacher::~Teacher()
{
if (this->name != NULL)
{
delete [] this->name;
this->name = NULL;
this->age = ;
}
}
/* 友元函数:重载左移操作符 */
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("刘备", );
Teacher t2("关羽", );
Teacher t3("张飞", );
Teacher t4("赵云", );
Teacher t5("马超", );
// 存入向量容器
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 ;
}

最新文章

  1. Linux网络驱动--snull
  2. 细说new与malloc的10点区别
  3. [Lua]索引极致,form.lua
  4. redis的管理工具
  5. iOS下uiview和uiscrollview设置背景图片的源码
  6. Cordova插件开发
  7. App Extensions篇之Share Extension
  8. iOS蓝牙交互(4.0)
  9. 记录python接口自动化测试--主函数(第六目)
  10. Swing组件 创建窗口应用
  11. dev和master合并冲突解决
  12. [Swift]LeetCode594. 最长和谐子序列 | Longest Harmonious Subsequence
  13. android HTTP镜像
  14. 【合集】Hadoop 合集
  15. iOS系统版本与机型的对应关系
  16. 理解OAuth 2.0 (摘自阮一峰网络日志)
  17. BZOJ4891:[TJOI2017]龙舟(Pollard-Rho,exgcd)
  18. 软件测试工具MonkeyTalk使用方法
  19. java 字节流和字符流转换类InputStreamReader,OutPutStreamReader
  20. Redux 处理异步 Action

热门文章

  1. Linux定时器的使用(三种方法)
  2. 在 Swift 项目中实现侧滑菜单-利用 SWRevealViewController
  3. python opencv3 —— 常用工具、辅助函数、绘图函数(图像添加文本、矩形等几何形状)
  4. Nginx 设置,设置已经解析的域名,在nginx中没有定义相应server时的默认访问
  5. c#.net公共帮助类
  6. UI组件之TextView及其子类(三)ToggleButton和Switch
  7. gdb 调试多线程 神贴
  8. iOS开发SDWebImage的基本使用
  9. 【PHP】php 递归、效率和分析(转)
  10. javascript合并数组并且删除第二项