【C++第三阶段】vector容器

这篇具有很好参考价值的文章主要介绍了【C++第三阶段】vector容器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以下内容仅为当前认识,可能有不足之处,欢迎讨论!



构造函数

vector函数是常用数据结构,见于刷题网站。

它是单端数组,与普通数组区别在于可以动态扩展。

动态扩展是编译器自动的,不是在原空间之后续接新空间,而是找更大的内存空间,将原数据拷贝新空间,释放原空间。

【C++第三阶段】vector容器,C++学习与回顾,c++,网络,开发语言

vector容器迭代器支持随机访问。

目前介绍四种vector的构造函数。

  • vector<T> v;
  • vector(v.begin() , v.end());
  • vector(n,elem);
  • vector(const vector &vec);

第①种创建一个普通的vetcor容器,容器元素为T,需要用其他方式对v赋值。

第②种将[v.begin(),end()]区间元素拷贝给本身。

第③种将n个elem个元素拷贝给本身。

第④种将其他vector容器拷贝给自身。

代码示例:

void printVector(vector<int> &v) {
	cout << "当前vector元素为:";
	for (vector<int>::iterator front = v.begin(); front != v.end(); front++) {
		cout << *front <<" ";
	}
	cout << endl;
}

void test0409() {
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	printVector(v);

	vector<int> vs(v.begin(), v.end());
	printVector(vs);

	vector<int> vss(3, 5);
	printVector(vss);

	vector<int> vsss(vs);
	printVector(vsss);
}

运行结果:

【C++第三阶段】vector容器,C++学习与回顾,c++,网络,开发语言

赋值操作

给vector容器赋值。

目前介绍的函数有:

  • vector & operator=(const vector &vec);
  • assign(beg , end);
  • assign(n ,elem);

第①种方法,是用另一个vector容器直接赋值。

第②种方法,是调用vector.assign()函数,对其赋值。

第③种方法,是调用vector.assign()函数,给容器n个elem元素。

代码示例:

void printVector(vector<int> &v) {
	cout << "当前vector元素为:";
	for (vector<int>::iterator front = v.begin(); front != v.end(); front++) {
		cout << *front <<" ";
	}
	cout << endl;
}
void test0409a() {
	vector<int> v;
	for (int i = 0; i < 5; i++) {
		v.push_back(1+i * i*i - i*i);
	}
	printVector(v);

	vector<int> v2 = v;
	printVector(v2);

	vector<int> v3;
	v3.assign(v2.begin(), v2.end());
	printVector(v3);

	vector<int> v4;
	v4.assign(3, 5);
	printVector(v4);
}

运行结果:

【C++第三阶段】vector容器,C++学习与回顾,c++,网络,开发语言

容量和大小

vector容器的大小和容量相关操作

目的 函数
判断容器是否为空 empty();
容器的容量,真实的占用空间大小 capacity();
容器的个数,常用 size();
重新指定容器长度为num,若容器变长,则默认值填充新位置。
若容器变短,则末尾容器长度被删除。
resize(int num);
重新指定容器长度为num,若容器变长,则默认值填充新位置。
若容器变短,则末尾超出容器长度被删除。
resize(int num , elem);

代码示例:

void printVector(vector<int> &v) {
	cout << "当前vector元素为:";
	for (vector<int>::iterator front = v.begin(); front != v.end(); front++) {
		cout << *front <<" ";
	}
	cout << endl;
}
void test0409b() {

	vector<int> v;
	cout << "容器是否为空?->" << v.empty() <<" . " << endl;
	for (int i = 0; i < 5; i++) {
		v.push_back(i + i * i * i - i * i);
	}
	printVector(v);
	cout << "容器是否为空?->" << v.empty() << " . " << endl;

	cout << "容器容量大小:" << v.capacity() << " . " << endl;
	cout << "容器个数:" << v.size() << " . " << endl;
	v.resize(2);
	printVector(v);
	cout << "容器容量大小:" << v.capacity() << " . " << endl;
	cout << "容器个数:" << v.size() << " . " << endl;

	v.resize(5, 5);
	printVector(v);
	cout << "容器容量大小:" << v.capacity() << " . " << endl;
	cout << "容器个数:" << v.size() << " . " << endl;

}

运行结果:

【C++第三阶段】vector容器,C++学习与回顾,c++,网络,开发语言

插入和删除

vector容器插入操作,删除操作

介绍有以下几个函数

插入:

目的 函数
尾部插入元素ele push_back(ele);
迭代器指向位置pos插入元素ele insert(const_iterator pos , ele);
迭代器指向位置pos插入n个元素ele insert(const_iterator pos , int count , ele);

删除:

目的 函数
删除最后一个元素 pop_back();
删除迭代器指向的元素 erase(const_iterator pos);
删除迭代器从start到end的元素 erase(const_iterator start , const_iterator end);
删除容器中所有元素 clear();

代码示例:

void printVector(vector<int> &v) {
	cout << "当前vector元素为:";
	for (vector<int>::iterator front = v.begin(); front != v.end(); front++) {
		cout << *front <<" ";
	}
	cout << endl;
}
void test0409c() {
	vector<int> v;
	for (int i = 0; i < 5; i++) {
		v.push_back(-i + i * i * i + i * i);
	}
	cout << "最开始vector" << endl;
	printVector(v);
	
	cout << "尾部插入一个元素5" << endl;
	v.push_back(5);
	printVector(v);

	cout << "在2号位置插入一个元素7" << endl;
	vector<int>::iterator it = v.begin();//开始
	(it++);//第2个位置
	v.insert(it, 7);
	printVector(v);

	cout << "向倒数第二个位置插入3个元素6" << endl;
	vector<int>::iterator end = v.end();
	end--;
	v.insert(end, 3, 6);
	printVector(v);

	cout << "删除最后一个元素" << endl;
	v.pop_back();
	printVector(v);

	cout << "删除当前首个元素" << endl;
	v.erase(v.begin());
	printVector(v);

	cout << "全删除" << endl;
	v.erase(v.begin(),v.end());
	printVector(v);

	cout << "删除所有元素" << endl;
	//v.clear();
	cout << "当前数组是否为空?" << v.empty() << " . " << endl;

}

注意,迭代器使用一次后会失效。

运行结果:

【C++第三阶段】vector容器,C++学习与回顾,c++,网络,开发语言

数据存取

对vector中的数据进行存取操作。

目的 函数
返回索引index所指的数据 at(int index);
返回索引index所指的数据 operator[];
返回容器中第一个数据元素 front();
返回容器中最后一个数据元素 back();

代码示例:

void printVector(vector<int> &v) {
	cout << "当前vector元素为:";
	for (vector<int>::iterator front = v.begin(); front != v.end(); front++) {
		cout << *front <<" ";
	}
	cout << endl;
	cout <<"============================================" << endl;
}

void test0409d() {

	vector<int> v;
	for (int i = 0; i < 5; i++) {
		v.push_back(-i + i * i * i + i * i);
	}
	cout << "最开始vector" << endl;
	printVector(v);

	cout << "取出索引为3的数据" << endl;
	cout << v.at(3) << endl;
	cout << "第二种方式取出索引为3的数据" << endl;
	cout << v[3] << endl;
	cout << "返回容器第一个元素" << endl;
	cout << v.front()<<endl;
	cout << "返回容器中最后一个数据" << endl; 
	cout << v.back();
}

运行结果:

【C++第三阶段】vector容器,C++学习与回顾,c++,网络,开发语言

互换容器

两个容器元素互换。——swap(vec);

代码示例:

void printVector(vector<int> &v) {
	cout << "当前vector元素为:";
	for (vector<int>::iterator front = v.begin(); front != v.end(); front++) {
		cout << *front <<" ";
	}
	cout << endl;
	cout <<"============================================" << endl;
}
void test0409e() {
	vector<int> v1;
	for (int i = 0; i < 5; i++) {
		v1.push_back((i + i * i * i)/3 + i * i);
	}
	printVector(v1);
	vector<int> v2;
	for (int i = 0; i < 4; i++) {
		v2.push_back((i - i * i * i) / 2 + i * i);
	}
	printVector(v2);
	v1.swap(v2);
	printVector(v1);
	printVector(v2);
}

运行结果:

【C++第三阶段】vector容器,C++学习与回顾,c++,网络,开发语言

预留空间

目的:减少vector在动态扩展容量时的扩展次数。

函数:reserve(int len);

容器预留len个元素长度,预留位置不初始化,元素不可访问。

代码示例:

想要在容器中插入十万条数据,看共开辟多少次空间。

void test0409f() {
	int num = 0;
	vector<int> v;
	int* p=NULL;
	for (int i = 0; i < 10000000; i++) {
		v.push_back(i);
		//p = &v[0];
		if (p != &v[0]) {
			p = &v[0];
			num++;
		}
	}
	cout << "一共开辟了" << num <<"次空间" << endl;
}

运行结果:

【C++第三阶段】vector容器,C++学习与回顾,c++,网络,开发语言

但是如果有预留空间,次数会大大减少。

在第5行插入v.reserve(1000000);

【C++第三阶段】vector容器,C++学习与回顾,c++,网络,开发语言


以上是我的学习笔记,希望对你有所帮助!
如有不当之处欢迎指出!谢谢!

【C++第三阶段】vector容器,C++学习与回顾,c++,网络,开发语言文章来源地址https://www.toymoban.com/news/detail-846871.html

到了这里,关于【C++第三阶段】vector容器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++提高编程——STL:string容器、vector容器

    本专栏记录C++学习过程包括C++基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下, 不定时更新,欢迎关注 。 当前章节处于: ---------第1阶段-C++基础入门 ---------第2阶段实战-通讯录管理系统, ---------第3阶段-C++核心编程, -----

    2024年01月23日
    浏览(32)
  • 【C++】vector容器的模拟实现

    目录 一,框架设计 二,构造函数 三,析构函数 四,赋值运算符 五,容器接口的实现 1,迭代器实现 2,“ [] ”运算符的实现 3,swap交换和resize重设大小 4,insert插入和erase删除 介绍:         本文,我们重点实现vector容器的用法,这里要注意的是vector容器可以接纳任意类

    2024年02月02日
    浏览(43)
  • Day 23 C++ vector容器

    定义 C++的vector容器是一个动态数组,提供了存储和操作元素的功能。它是标准模板库(STL)的一部分,在头文件中定义。 vector数据结构和 数组非常相似 ,也称为 单端数组 ( 动态数组 )( 也被称为向量 ) 使用vector容器前,需要引入头文件: vector容器的迭代器——支持随

    2024年02月14日
    浏览(20)
  • C++ —— STL容器【vector】模拟实现

    本章代码gitee仓库:vector模拟实现、vector源码 看源码发现 vector 是类模板定义的,成员是采用迭代器进行管理 当涉及到容器类时,通常有一些关键函数,如构造函数、析构函数和拷贝构造函数,它们负责初始化容器对象、销毁对象和进行对象的拷贝等 这里注意拷贝构造要实现

    2024年02月16日
    浏览(30)
  • 【C++】:C++中的STL序列式容器vector源码剖析

    vector定于与stl_vector.h头文件中 例如: vector的数据结构非常简单:一个线性连续空间 下面介绍vector的3个数据结构: start:表示目前使用空间的头 finish:表示目前使用空间的尾 end_of_storage:表示目前可用空间的尾 说明:为了降低空间配置时的速度成本,vector实际配置的大小可

    2024年01月22日
    浏览(35)
  • C++ stl容器vector的底层模拟实现

    目录 前言:   1.成员变量,容量与大小 2.构造函数 无参构造: 带参的使用值进行构造:  使用迭代器区间进行构造: 3.交换 4.拷贝构造 5.赋值重载 6.迭代器 7.扩容 reserve: resize: 8.插入与删除 insert: erase: insert迭代器失效问题: erase迭代器失效问题: 9.头插头删 10.[]重载

    2024年04月15日
    浏览(29)
  • C++容器(vector、deque、list、map)

    数组尾部添加或删除元素非常迅速。但在中部或头部就比较费时。 *代码演示:* 取: at在下标越界时会抛出异常,我们能捕获异常进行处理;而[]下标越界会让程序直接终止; 构造函数: cbegin, cend, crbegin, crend返回的是常量迭代器,不能通过迭代器修改vector元素的值。 插入(

    2024年02月02日
    浏览(40)
  • 【C++】容器篇(一)—— vector 的基本概述以及模拟实现

    前言: 在之前,我们已经对 string类进行了基本的概述,并且手动的实现了string类中常用的接口函数。本期,我将带领大家学习的是STL库中的一个容器 -- vector 的学习。相比于之前的string类,本期的 vector 相对来说实现起来略微难一点,难点就在于要考虑关于 “ 迭代器失效 ”

    2024年02月07日
    浏览(32)
  • 【C++入门】STL容器--vector底层数据结构剖析

    目录  前言  1. vector的使用       vector的构造  vector迭代器  vector空间相关的接口  vector 功能型接口  find  swap  insert  erase 2. vector内部数据结构剖析 reserve  push_back和pop_back size、capacity、empty、operator[ ];  insert和erase resize swap  拷贝构造和赋值重载 构造函数补充  迭代器

    2024年01月25日
    浏览(36)
  • 探索C++中的动态数组:实现自己的Vector容器

    🎉个人名片 : 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🙈个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN🎉🎉🎉 🐵系列专栏:零基础学习C语言----- 数据结构的学习之路----C++的学习之路 🐓每日一句:如果没有特别幸运,那就请特

    2024年03月16日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包