Leave no stone unturned. 竭尽全力
文章目录
- 1. 基本概念
- 1.1 功能
- 1.2 与普通数组相同点与不同点
- 1.3 动态扩展
- 2. 构造函数
- 2.1 功能描述
- 2.2 函数原型
- 2.3 代码展示
- 3. 赋值操作
- 3.1 函数原型
- 3.2 代码展示
- 4. 容量及大小
- 4.1 函数原型
- 4.2 代码展示
- 4.2.1 `empty()`
- 4.2.1.1 代码展示
- 4.2.1.2 测试结果
- 4.2.2 `capacity()`
- 4.2.2.1 代码展示
- 4.2.2.2 测试结果
- 4.2.3 `size()`
- 4.2.3.1 代码展示
- 4.2.3.2 测试结果
- 4.2.4 `resize()`
- 4.2.4.1 基本用法
- 4.2.4.1.1 代码展示
- 4.2.4.1.2 测试结果
- 4.2.4.2 重载函数
- 4.2.4.2.2 代码展示
- 4.2.4.2.2 测试结果
- 4.3 深度思考
- 4.3.1 思考1
- 4.3.1.1 疑问
- 4.3.1.2 测试
- 4.3.1.3 解答
- 4.3.2 思考2
- 4.3.2.1 疑问
- 4.3.2.2 解释
- 4.3.3 思考3
- 4.3.3.1 疑问
- 4.3.3.2 解释
- 4.3.3.3 举例展示
- Thanks for everything!
1. 基本概念
1.1 功能
- vector数据类型和数组非常相似,也称为单端数组
1.2 与普通数组相同点与不同点
- 相同点: 都可以存取数据类型
- 不同点: 数组是静态空间,给定空间范围后,最多只能存取固定的数值;而vector可以动态扩展,伴随输入值可以扩展内存空间【注意:如果插入数据超过容器容量,则不是在原有空间内扩展,而是直接换一个内存更大的空间进行存储】
1.3 动态扩展
- 并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放新空间
- vector容器的迭代器是支持随机访问的迭代器
2. 构造函数
2.1 功能描述
- 创建vector容器
2.2 函数原型
vector<T> v;
采用模板实现类实现,默认构造函数vector(v.begin(), v.end());
将v[begin(), end())区间中的元素拷贝给本身【注意前闭后开!!!】vector(n, elem);
构造函数将n个elem拷贝给本身vector(const vector &vec);
拷贝构造函数
2.3 代码展示
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
//vector容器构造
void vectorPrint(vector<int> &v) { //打印容器的函数
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << (*it) << " ";
}
cout << endl;
}
void text01() {
// 默认构造,无参构造
vector<int> v;
for (int i = 0; i < 10; i++) {
v.push_back(i);
}
vectorPrint(v);
//通过区间方式进行构造,传入两个迭代器进行构造
vector<int> v1(v.begin(), v.end());
vectorPrint(v1);
//n个elem方式构造
vector<int> v2(10, 4); //第一个参数为个数,第二个参数为值
vectorPrint(v2);
//拷贝构造(重要!!!)
vector<int> v3(v2);
vectorPrint(v3);
}
int main() {
text01();
}
3. 赋值操作
3.1 函数原型
vector& operator=(const vector &vec);
重载等号操作符assign(begin, end);
将[begin, end)区间中的数据拷贝赋值给本身assign(n, elem);
将n个elem拷贝赋值给本身
3.2 代码展示
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
void vectorPrint(vector<int> &v) { //打印容器的函数
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << (*it) << " ";
}
cout << endl;
}
//vector容器赋值操作
void text01() {
vector<int> v1;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
}
vectorPrint(v1);
//operator的"="赋值
vector<int>v2 = v1;
vectorPrint(v2);
//assign赋值
vector<int>v3;
v3.assign(v1.begin(), v1.end()); //提供两个迭代器,一个指向起始数据(可以取到),另一个指向结束数据(取不到)
vectorPrint(v3);
//n个elem方式赋值
vector<int>v4;
v4.assign(10, 8);
vectorPrint(v4);
}
int main() {
text01();
return 0;
}
4. 容量及大小
4.1 函数原型
empty();
判断容器是否为空- 如果为空,则返回true
- 不为空,则返回false
capacity
容器的容量size()
返回容器元素中的个数resize(int num);
重新指定容器的长度为num,若容器变长,则以默认值0填充新的位置;如果容器变短,则末尾超出容器长度的元素被删除resize(int num, elem);
重新定义容器的长度为num,若容器变长,则以elem值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除
4.2 代码展示
4.2.1 empty()
4.2.1.1 代码展示
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
void vectorPrint(vector<int>& v) { //打印容器的函数
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << (*it) << " ";
}
cout << endl;
}
void text02() {
vector<int> v1;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
}
vectorPrint(v1);
//判断是否为空 【空->true 非空->false】
if (v1.empty()) cout << "v1为空" << endl;
else cout << "v1不为空" << endl;
}
int main() {
text02();
return 0;
}
4.2.1.2 测试结果
4.2.2 capacity()
4.2.2.1 代码展示
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
void vectorPrint(vector<int>& v) { //打印容器的函数
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << (*it) << " ";
}
cout << endl;
}
void text03() {
vector<int> v;
for (int i = 0; i < 10; i++) {
v.push_back(i);
}
vectorPrint(v);
int cap = v.capacity();
cout << "容器的容量为:" << cap << endl;
}
int main() {
text03();
return 0;
}
4.2.2.2 测试结果
4.2.3 size()
4.2.3.1 代码展示
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
void vectorPrint(vector<int>& v) { //打印容器的函数
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << (*it) << " ";
}
cout << endl;
}
void text04() {
vector<int> v;
for (int i = 0; i < 10; i++) {
v.push_back(i);
}
vectorPrint(v);
int size = v.size();
cout << "容器的大小(容器中元素的个数)为:" << size << endl;
}
int main() {
text04();
return 0;
}
4.2.3.2 测试结果
4.2.4 resize()
4.2.4.1 基本用法
4.2.4.1.1 代码展示
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
void vectorPrint(vector<int>& v) { //打印容器的函数
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << (*it) << " ";
}
cout << endl;
}
void text05() {
vector<int> v;
for (int i = 0; i < 10; i++) {
v.push_back(i);
}
vectorPrint(v);
v.resize(15);
vectorPrint(v);
//如果重新指定的比原来长了,默认用0填充新的位置
v.resize(6);
vectorPrint(v);
//如果重新指定的比原来短了,则末尾超出容器长度的元素将会被删除
}
int main() {
text05();
return 0;
}
4.2.4.1.2 测试结果
4.2.4.2 重载函数
- 利用重载版本,可以指定参数2为默认填充值
4.2.4.2.2 代码展示
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
void vectorPrint(vector<int>& v) { //打印容器的函数
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << (*it) << " ";
}
cout << endl;
}
void text06() {
vector<int> v;
for (int i = 0; i < 10; i++) {
v.push_back(i);
}
vectorPrint(v);
v.resize(15,111); //利用重载版本,可以指定参数2为默认填充值
vectorPrint(v);
//如果重新指定的比原来长了,默认用111填充新的位置
v.resize(6);
vectorPrint(v);
//如果重新指定的比原来短了,则末尾超出容器长度的元素将会被删除
}
int main() {
text06();
return 0;
}
4.2.4.2.2 测试结果
4.3 深度思考
4.3.1 思考1
4.3.1.1 疑问
如果插入10个数,那vector的容器的内存空间会刚好是10嘛?还是会大于是10?是个定值还是是随机的数捏?
4.3.1.2 测试
我们不妨写一下代码,检测一下:
//Day03 vector容器的容量和大小操作
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
void vectorPrint(vector<int>& v) { //打印容器的函数
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << (*it) << " ";
}
cout << endl;
}
//vector容器的容量和大小操作
void text01() {
vector<int> v1;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
}
vectorPrint(v1);
int cap=v1.capacity();
cout << "容量为:" << cap << endl;
}
int main() {
text01();
return 0;
}
4.3.1.3 解答
答案是13。原因就是vector容器具有自动扩展的特性,使得容器的容量值总大于等于容器的大小(存入值的个数)
4.3.2 思考2
4.3.2.1 疑问
如果在已存入一些值的容器中,再插入一些数据,在已经达到容器容量的情况下,还会自动在容器末插入数据嘛???
4.3.2.2 解释
假设还是存入10个数值,原容器则会开辟出13个内存空间,剩余3个空间;如果再插入3个以上的数据,使容器大小>容器容量,则会重新开辟一个内存空间更大的容器,重新存储
4.3.3 思考3
4.3.3.1 疑问
容器的容量指的是容器的全部内存嘛???
4.3.3.2 解释
注意:
vector
容器中capacity并非显示的是vector
真正所占用的空间,vector
类本身用sizeof函数返回字节,是容器本身的占用空间,而用函数开辟的空间,被容器在堆中开辟的内存,不会影响容器本身的占用!要想获得容器的全部内存,需要用(sizeof(容器)+容器().capacity())
计算!vs为1.5倍扩容,所以当插入10个数时内存空间扩到13,全部内存为29
4.3.3.3 举例展示
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
void vectorPrint(vector<int>& v) { //打印容器的函数
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << (*it) << " ";
}
cout << endl;
}
//vector容器的容量和大小操作
void text01() {
vector<int> v1;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
}
vectorPrint(v1);
int cap=v1.capacity();
cout << "容量为:" << cap << endl;
int all_cap = v1.capacity() + sizeof(v1);
cout << all_cap << endl;
}
int main() {
text01();
return 0;
}