【C++】10:Vector的理解和使用

目录

一、vector的介绍和使用

1.1 vector的介绍

1.2 vector的使用

二、vector的构造函数

2.1 无参构造函数

2.2 构造并且初始化n个val

2.3 使用迭代器进行初始化构造

2.4 拷贝构造

三、vector的迭代器

四、vector的空间增长问题

4.1 size

4.2 capacity

4.3 empty

4.4 resize(重点)

4.5 reserve(重点)

五、vector的元素获取

5.1 operator[]  (重点)

5.2 at

5.3 back

5.4 front

六、vector的增删查改

6.1 push_back(重点)

6.2 pop_back

6.3 insert

6.4 erase

6.5 swap

6.6 clear


一、vector的介绍和使用

1.1 vector的介绍

vector的文档介绍

使用STL的三个境界:能用,明理,能扩展,那么下面学习vector,我们也是按照这个方法去学习

1.2 vector的使用

vector学习时一定要学会查看文档:vector的文档介绍,vector在实际中非常的重要,在实际中,我门熟悉常见的接口就可以,下面列出了哪些接口是要重点掌握的。

使用vector要包含vector头文件

二、vector的构造函数

我们在vector的文档介绍可以看到vector的构造函数如下所示:

2.1 无参构造函数

#include<iostream>
using namespace std;
#include<vector>
int main() {
	vector<int> v;
	return 0;
}

2.2 构造并且初始化n个val

如果传参的时候没有写val值,就会调用这个类型的默认构造函数。

#include<iostream>
using namespace std;
#include<vector>
int main() {
	vector<int> v(10,1);
	for (int i = 0; i < v.size(); i++) {
		cout << v[i] << " ";
	}
	cout << endl;
	return 0;
}

2.3 使用迭代器进行初始化构造

#include<iostream>
using namespace std;
#include<vector>
int main() {
	vector<int> v(10, 2);
	vector<int> v2(v.begin(), v.end());
	for (int i = 0; i < v2.size(); i++) {
		cout << v2[i] << " ";
	}
	cout << endl;
	return 0;
}

2.4 拷贝构造

#include<iostream>
using namespace std;
#include<vector>
int main() {
	vector<int> v(10, 2);
	vector<int> v1(v);
	for (int i = 0; i < v1.size(); i++) {
		cout << v1[i] << " ";
	}
	cout << endl;
	return 0;
}

三、vector的迭代器

在string类里面我们讲过,迭代器属于其对应容器的类域,所以我们在声明vector迭代器时,需要指定类域。

与string类似,vector也有八种迭代器,如下所示:

我们重点掌握的就是begin和end。代码如下:

#include<iostream>
using namespace std;
#include<vector>
int main() {
	vector<int> v(10, 3);
	vector<int>::iterator vit = v.begin();
	while (vit != v.end()) {
		cout << *vit << " ";
		*vit++;
	}
	cout << endl;
	return 0;
}

四、vector的空间增长问题

4.1 size

这个方法会返回vector容量里面的元素个数。

4.2 capacity

这个方法会返回vector实际开的空间是多少。我们在push数据时,会经常多开一点,为了避免一直扩容,代码如下所示:

4.3 empty

这个方法是判断vector是否为空

4.4 resize(重点)

函数原型如下:

这个函数是重新设置vector的size。n是重新设置的大小,第二个参数是大于原本的size时,需要插入的值,如果没有写,就使用vector类型的默认参数

具体有三种情况

1、n小于原本的size:

这种情况直接发生截断,大于n的部分直接丢弃。容量不变,代码如下:

#include<iostream>
using namespace std;
#include<vector>
int main() {
	vector<int> v(10, 1);
	v.resize(5);
	for (int i = 0; i < v.size(); i++) {
		cout << v[i] << " ";
	}
	cout << endl;
	cout << "capacity:" << v.capacity()<<endl;
	return 0;
}

2、n大于原本的size,但是小于vector的容量:

这种情况会将size改为n,并向vector中添加元素,不会扩容。代码如下所示:

#include<iostream>
using namespace std;
#include<vector>
int main() {
	vector<int> v(10, 1);
	v.reserve(20);
	cout << "capacity:" << v.capacity() << endl;
	v.resize(15,9);
	for (int i = 0; i < v.size(); i++) {
		cout << v[i] << " ";
	}
	cout << endl;
	cout << "capacity:" << v.capacity() << endl;
	return 0;
}

3、n大于原本的size,并且大于vector的容量:

这种情况会将size改为n,并向vector中添加元素,会扩容。代码如下所示:

#include<iostream>
using namespace std;
#include<vector>
int main() {
	vector<int> v(10, 1);
	v.reserve(20);
	cout << "capacity:" << v.capacity() << endl;
	v.resize(30, 9);
	for (int i = 0; i < v.size(); i++) {
		cout << v[i] << " ";
	}
	cout << endl;
	cout << "capacity:" << v.capacity() << endl;
	return 0;
}

4.5 reserve(重点)

reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题,我们来看一下reserve的介绍:

1、当n大于原本的容量时,vector会增加容量到n或者增加到比n更大。代码如下所示:

#include<iostream>
using namespace std;
#include<vector>
int main() {
	vector<int> v(10, 1);
	cout << "size    :" << v.size() << endl;
	cout << "capacity:" << v.capacity() << endl;
	v.reserve(50);
	cout << "size    :" << v.size() << endl;
	cout << "capacity:" << v.capacity() << endl;
	return 0;
}

2、当n小于原本的容量,大于size时,容量不变,代码如下所示:

#include<iostream>
using namespace std;
#include<vector>
int main() {
	vector<int> v;
	for (int i = 0; i < 20; i++) {
		v.push_back(1);
	}
	cout << "size    :" << v.size() << endl;
	cout << "capacity:" << v.capacity() << endl;
	v.reserve(25);
	cout << "size    :" << v.size() << endl;
	cout << "capacity:" << v.capacity() << endl;
	return 0;
}

3、当n小于原本的容量,小于size时,容量不变,代码如下所示:

#include<iostream>
using namespace std;
#include<vector>
int main() {
	vector<int> v;
	for (int i = 0; i < 20; i++) {
		v.push_back(1);
	}
	cout << "size    :" << v.size() << endl;
	cout << "capacity:" << v.capacity() << endl;
	v.reserve(10);
	cout << "size    :" << v.size() << endl;
	cout << "capacity:" << v.capacity() << endl;
	return 0;
}

可以确定的时reserve肯定时不会缩容的。

五、vector的元素获取

5.1 operator[]  (重点)

在vector中,也同样重载了[]运算符,我们可以通过[]使用下标来访问元素,代码如下所示:

#include<iostream>
using namespace std;
#include<vector>
int main() {
	vector<int> v(10, 1);
	for (int i = 0; i < v.size(); i++) {
		cout << v[i] << " ";
	}
	cout << endl;
 	return 0;
}

5.2 at

at和[]差不多,代码如下所示:

#include<iostream>
using namespace std;
#include<vector>
int main() {
	vector<int> v(10, 1);
	for (int i = 0; i < v.size(); i++) {
		cout << v.at(i) << " ";
	}
	cout << endl;
	return 0;
}

5.3 back

back是取vector的尾元素

5.4 front

front是取vector的首元素。

六、vector的增删查改

6.1 push_back(重点)

push_back是往vector末尾插入一个元素,代码如下:

#include<iostream>
using namespace std;
#include<vector>
int main() {
	vector<int> v;
	for (int i = 0; i < 10; i++) {
		v.push_back(1);
	}
	for (int i = 0; i < 10; i++) {
		cout << v[i] << " ";
	}
	return 0;
}

6.2 pop_back

push_back是在vector末尾删除一个元素。

6.3 insert

insert函数原型如下:

vector不像string类一样,能支持下标插入,在vector中,它只支持迭代器插入。但是我们可以间接的使用下标插入,将迭代器加上下标就可以在该位置插入了。

它可以在这个位置插入一个值,也可以插入多个值,也可以在这个位置插入一个迭代器区间的内容。

我们在insert之后,pos就失效了,不要直接访问,要访问就要更新这个失效的迭代器的值。

在vs编译器会进行强制的pos检查。如果插入,无论扩容没有,都不能使用这个pos,访问就会报错。

insert函数的返回值是插入元素的迭代器。

6.4 erase

erase的函数原型如下:

可以删除迭代器位置的元素,也可以删除迭代器区间的元素。

和insert一样,我们在执行erase函数之后,这个迭代器就失效了,不允许再次使用这个迭代器,使用就要更新。erase函数的返回是删除元素的下一个元素的迭代器。

6.5 swap

这个函数是交换两个vector容器。

6.6 clear

将vector的size设置为0,容量不变,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值