序列容器vector和迭代器

news/2024/7/8 8:30:52

一、容器vector

vector类模板提供了一种占用连续内存地址的数据结构。这使得它可以高效,直接的利用下标运算符[]访问vector中的任一元素,当一个vecto的内存空间耗尽时,它会分配一个更大的连续空间(数组),把原先的数据复制(或移动)到新的空间(数组),并把原来的空间(数组)释放。

其中的#0,#1…就是容器内的元素。从上图可以看出vector维护的是一个连续的线性空间,和数组是一样的。所以不论其元素为何种型别,普通指针就可以作为vector的迭代器!因为vector迭代器所需要的操作如operator*,operator->,operator++,operator+,operator-,operator+=,operator-=,普通指针天生就具备。查看vector的源码,我们可以看到vector的迭代器并没有另外定义为一个模版类,而是直接 typedef value_type* iterator。 更可以看出 vector 的迭代器就是一个普通指针。
在这里插入图片描述
实现vector容器的类名为vector,包含类vector的头文件是,并且命名空间为std

二、迭代器Iterator

一个标准化遍历各类容器里面的所有对象的方法类(典型的设计模式),把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构

三、实现的功能

1.创建vector对象
定义了一个存储Vector类型的对象iterator

typedef Iterator<Vector<T>> iterator;  //类类型的重定义

用构造函数创建对象

Vector()
	{
		mdata = new T[2];
		cursize = 0;
		totalsize = 2;
	}

2.vector对象不等关系的比较

bool operator!=(const Iterator<Container>& rhs)
	{
		return mpos != rhs.mpos;
	}

3.使用指针输出数组
数组中的指针可视为迭代器,函数begin返回指向数组第一个元素的迭代器,函数end返回数组末端最后一位的迭代器

//返回数组第一个元素的迭代器
	iterator begin()
	{
		return iterator(this, 0);
	}
	//返回数组末端最后一位的迭代器
	iterator end()
	{
		return iterator(this, cursize);
	}

4.使用运算符[]访问和修改vector元素的下标

char& operator[](int index)
	{
		return mpstr[index];
	}

5.一个vector对象用另外一个vector对象初始化

String(char* pstr) :mpstr(new char[strlen(pstr) + 1]())
	{
		strcpy(mpstr, pstr);
	}

6.vector的成员函数 push_back:尾插入元素,如果在已满的vector插入元素,vevtor会扩容

 void push_back(T val)
    	{
    		if (IsFull())
    		{
    			resize();
    		}
    		mdata[cursize++] = val;
    	}

7.扩容

void resize()
	{
		T* pnewspace = new T[totalsize * 2];
		memcpy(pnewspace, mdata, sizeof(T)*totalsize);
		delete[]mdata;
		mdata = pnewspace;
		totalsize *= 2;
	}

7.vector的成员函数 pop_back:尾删除元素,若访问一个无效的下标或无效的实参,抛出异常 throw exception

  void pop_back()
    {
    	if (IsEmpty())
    	{
    		throw exception("vector is empty !");
    	}
    	cursize--;
    }

http://www.niftyadmin.cn/n/4058275.html

相关文章

SCAU 软件工程 期末复习

软件发展阶段 程序设计阶段——50至60年代 程序系统阶段——60至70年代 软件工程阶段——70年代以后 软件工程的生命周期 1.需求分析&#xff08;RequirementsCapture&#xff09; 2.系统分析与设计&#xff08;SystemAnalysis and Design&#xff09; 3.系统实现&#…

年轻工程师怎样修炼成为“高手”

本人做过技术开发工作多年&#xff0c;从焊电路板的小工程师逐渐做到项目经理、研发经理&#xff0c;现在做到总工程师&#xff0c;作为工程师有亲身的感受&#xff0c;作为研发主管&#xff0c;对工程师的性格、心理和知识结构有非常深入的了解&#xff0c;现在把自己的一点感…

冒泡,选择,插入,希尔

/Files/fxllx82/Sorter.rar冒泡演示 转载于:https://www.cnblogs.com/fxllx82/archive/2008/07/17/1245347.html

jQuery简洁大方的登录页面模板

jQueryCSS网站登录模板本模板带验证码在线体验&#xff1a;http://hovertree.com/texiao/jquery/13.htmDemo 2&#xff1a;http://hovertree.com/hvtart/bjae/vgte3y3a.htmDemo 3&#xff1a;http://hovertree.com/hvtart/bjae/dw0f8ytk.htm以下是HTML文件代码&#xff1a; <…

继承与派生(一)

1.继承的作用&#xff1a; 代码复用 继承和派生&#xff0c; 基类和派生类 class Stu : public People 类标识 类名 访问限定符 基类类名 访问限定符一般都为public 2.派生类继承基类的什么东西 除了基类的构造和析构函数以外的所有成员 所以&#xff0c;派生类的构造需要自…

SCAU OOAD PPT题目汇总

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210619133843306.png?x-oss-processimage/watermark,t ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210619134549473.png?x-oss-processimage/watermar 、

MySQL 初学笔记

MD5加密 update test set passwardMD5(passward); insert into test values(4,name,MD5(passward));检验&#xff1a;将用户传入的密码也进行MD5加密&#xff0c;再进行对比即可检验 create database if not exists school; -- 创建一个school数据库 use school;-- 创建学生表…

JavaWeb 初学笔记

Tomcat Tomcat是Apache 软件基金会&#xff08;Apache Software Foundation)的jakarta项目中的一个核心项目&#xff0c;最新的Servlet 和JSP 规范总是能在Tomcat中得到体现&#xff0c;因为Tomcat 技术先进、性能稳定&#xff0c;而且免费&#xff0c;因而深受lava爱好者的喜…