C++学习笔记二:vector(向量)

偶尔善良 提交于 2019-12-23 10:24:54

C++学习笔记二:vector(向量)

介绍

  1. vector是一个可存储任意类型数据的动态数组。
  2. 分配空间方式:当分配空间不够时,会申请更大的内存空间(增长倍数:2),将原数据拷贝到新的内存块中,释放原内存空间。[连续线性空间]

用法

1. 声明和初始化

	int size = 10;
	int a = 1;
	int arr[5] = { 1,2,3,4,5 };
	//vector construction
	vector<int> v1;

	//vector initialization:five types
	vector<int> v1(size); //type 1
	vector<int> v1(size, 5); //type 2
	vector<int> v2(v1); //type 3
	vector<int> v2(v1.begin(), v1.begin() + 4); //type 4
	vector<int> v2(arr, arr + 2); //type 5

2. 基本操作
(1)字符串拼接

v1.push_back(a); // 尾部插入
v1.pop_back(); //尾部删除
v1.insert(v1.begin() + 2, 2);//在v1[1]后面(即v1[2]的位置)插入1个数,值均为2
v1.insert(v1.begin() + 2, 2, 3);//在v1[1]后面插入2个数,值均为5
v1.insert(v1.begin() + 2, arr + 2, arr + 4);//在v1[1]后面插入arr[2] ~ arr[3]的数
v1.erase(); //操作同insert,删除元素
v1.assign(v2.begin(), v2.begin() + 2); //将v2[0]~v2[1]赋值到v1,清除以前的内容
v1.assign(5, 1); // v1含有5个元素,每个元素均为1
v1.clear(); // 清空v1元素

(2)元素访问

v1[1]; //下标访问
v1.at(1); //at访问,at会检查是否越界
v1.front(); //访问第一个元素
v1.back(); //访问最后一个元素

(3)方法

v1.empty(); //v1是否为空
v1.capacity(); //v1的容器大小
v1.size(); //v1的实际大小
v1.swap(v2); //交换v1和v2
v1.resize(20); //v1元素个数调整为20个,值随机
v1.resize(20,1); ////v1元素个数调整为20个,值为1
v1.reserve(30); //将v1的capacity调整为30

(4)迭代器

vector<int>::iterator it;
vector<int>::const_iterator c_it;
it = v1.begin(); //v1首指针
it = v1.end(); //v1尾指针
c_it = v1.cbegin(); //v1的首指针,返回常迭代器
c_it = v1.cend(); //v1的尾指针,返回常迭代器

(5)算法

#include <algorithm> 
sort(v1.begin(), v1.begin() + 3); //v1[0]~v1[2]排序
reverse(v1.begin(), v1.begin() + 3); // v1[0]~v1[2]翻转
copy(v1.begin(), v1.begin() + 3, v2.begin() + 1); //v1[0]~v1[2]复制到v2[1]~后面
find(v1.begin(), v1.begin() + 3, 10); //v1[0]~v1[2]中找10,返回位置(迭代器)

3. vector作为函数形参

void function_1(vector<int> vec) // 值传递,实参给形参赋值时调用了拷贝构造函数
void function_2(vector<int> &vec) // 传引用,不会调用拷贝构造函数
void function_3(vector<int> *vec) // 传指针,不会调用拷贝构造函数

(1)值传递:vec作用域仅为函数内部,形参值修改不影响实参值。
(2)引用传递:引用是实参的别名,共用同一个内存空间,形参值修改影响实参。
(3)指针传递:指针指向实参地址,形参修改会影响实参。

void function_1(vector<int> vec) {
	int tmp;
	tmp = vec[1];
	vec[0] = vec[1];
	vec[1] = tmp;
	cout << "function_1 :";
	for (auto it = vec.begin(); it != vec.end(); it++)
	{
		cout << *it;
	}
	cout << endl;
}

void function_2(vector<int> &vec) {
	int tmp;
	tmp = vec[1];
	vec[0] = vec[1];
	vec[1] = tmp;
	cout << "function_2 :";
	for (auto it = vec.begin(); it != vec.end(); it++)
	{
		cout << *it;
	}
	cout << endl;
}

void function_3(vector<int> *vec) {
	int tmp;
	tmp = (*vec)[1];
	(*vec)[0] = (*vec)[1];
	(*vec)[1] = tmp;
	cout << "function_3 :";
	for (auto it = vec->begin(); it != vec->end(); it++)
	{
		cout << *it;
	}
	cout << endl;
}

运行结果
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!