Day07 C++STL入门基础知识四——vector容器(上) 基本概念-构造函数-赋值操作-容量大小【全面深度剖析+例题代码展示】

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 动态扩展

  • 并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放新空间
    Day07 C++STL入门基础知识四——vector容器(上) 基本概念-构造函数-赋值操作-容量大小【全面深度剖析+例题代码展示】_第1张图片
  • vector容器的迭代器是支持随机访问的迭代器

2. 构造函数

2.1 功能描述

  • 创建vector容器

2.2 函数原型

  • vector v; 采用模板实现类实现,默认构造函数
  • vector(v.begin(), v.end()); 将v[begin(), end())区间中的元素拷贝给本身【注意前闭后开!!!】
  • vector(n, elem); 构造函数将n个elem拷贝给本身
  • vector(const vector &vec); 拷贝构造函数

2.3 代码展示

#include
#include
#include
#include
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();
}

Day07 C++STL入门基础知识四——vector容器(上) 基本概念-构造函数-赋值操作-容量大小【全面深度剖析+例题代码展示】_第2张图片

3. 赋值操作

3.1 函数原型

  • vector& operator=(const vector &vec); 重载等号操作符
  • assign(begin, end); 将[begin, end)区间中的数据拷贝赋值给本身
  • assign(n, elem); 将n个elem拷贝赋值给本身

3.2 代码展示

#include
#include
#include
#include
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;
}

Day07 C++STL入门基础知识四——vector容器(上) 基本概念-构造函数-赋值操作-容量大小【全面深度剖析+例题代码展示】_第3张图片

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
#include
#include
#include
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 测试结果

Day07 C++STL入门基础知识四——vector容器(上) 基本概念-构造函数-赋值操作-容量大小【全面深度剖析+例题代码展示】_第4张图片

4.2.2 capacity()

4.2.2.1 代码展示

#include
#include
#include
#include
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 测试结果

Day07 C++STL入门基础知识四——vector容器(上) 基本概念-构造函数-赋值操作-容量大小【全面深度剖析+例题代码展示】_第5张图片

4.2.3 size()

4.2.3.1 代码展示

#include
#include
#include
#include
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 测试结果

Day07 C++STL入门基础知识四——vector容器(上) 基本概念-构造函数-赋值操作-容量大小【全面深度剖析+例题代码展示】_第6张图片

4.2.4 resize()

4.2.4.1 基本用法

4.2.4.1.1 代码展示
#include
#include
#include
#include
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 测试结果

Day07 C++STL入门基础知识四——vector容器(上) 基本概念-构造函数-赋值操作-容量大小【全面深度剖析+例题代码展示】_第7张图片

4.2.4.2 重载函数

  • 利用重载版本,可以指定参数2为默认填充值
4.2.4.2.2 代码展示
#include
#include
#include
#include
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 测试结果

Day07 C++STL入门基础知识四——vector容器(上) 基本概念-构造函数-赋值操作-容量大小【全面深度剖析+例题代码展示】_第8张图片

4.3 深度思考

4.3.1 思考1

4.3.1.1 疑问

如果插入10个数,那vector的容器的内存空间会刚好是10嘛?还是会大于是10?是个定值还是是随机的数捏?

4.3.1.2 测试

我们不妨写一下代码,检测一下:

//Day03 vector容器的容量和大小操作
#include
#include
#include
#include
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;
}

Day07 C++STL入门基础知识四——vector容器(上) 基本概念-构造函数-赋值操作-容量大小【全面深度剖析+例题代码展示】_第9张图片

4.3.1.3 解答

答案是13。原因就是vector容器具有自动扩展的特性,使得容器的容量值总大于等于容器的大小(存入值的个数)

4.3.2 思考2

4.3.2.1 疑问

如果在已存入一些值的容器中,再插入一些数据,在已经达到容器容量的情况下,还会自动在容器末插入数据嘛???

4.3.2.2 解释

假设还是存入10个数值,原容器则会开辟出13个内存空间,剩余3个空间;如果再插入3个以上的数据,使容器大小>容器容量,则会重新开辟一个内存空间更大的容器,重新存储
Day07 C++STL入门基础知识四——vector容器(上) 基本概念-构造函数-赋值操作-容量大小【全面深度剖析+例题代码展示】_第10张图片

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
#include
#include
#include
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;
}

Day07 C++STL入门基础知识四——vector容器(上) 基本概念-构造函数-赋值操作-容量大小【全面深度剖析+例题代码展示】_第11张图片

Thanks for everything!

Day07 C++STL入门基础知识四——vector容器(上) 基本概念-构造函数-赋值操作-容量大小【全面深度剖析+例题代码展示】_第12张图片

你可能感兴趣的:(关于C++那点破事,c++,数据结构,算法,vector,容器)