当前位置: 首页 > 编程日记 > 正文

【stanford C++】容器III——Vector类

主要介绍如下5个容器类——Vector, Stack,Queue,Map和Set,各个都表示一重要的抽象数据类型。另外,各个类都是一些简单类型的值的集合,所以称它们为容器类。

暂且我们先不需要知道它们是如何实现的,我们先来学习一下如何使用它们。

为了能使用这些容器类,必须包含适合的接口,就像包含相应的库一样。如下:

#include "vector.h"

就是包含了Vector类的接口,包含该头文件后,就可以在程序中使用Vector类了。

一、Vector类

Vector类类似于C++中数组,然后,C++中数组有如下的缺点:

  • 数组在定义时指定其大小,后续不能改变。
  • 尽管数组有固定的大小,但是程序员不能获取该大小。结果就是,需要一个额外的变量来跟踪数组中的元素数目。
  • 传统的数组不支持插入和删除元素。
  • C++中数组不能确保你选择的数据一定存在于数组中,例如,当一个数组保存了25个元素,当要选择索引为50的位置的元素时,C++将简单的查看内存位置,若存在则就查看到。

Vector类通过抽象数据类型来重新实现数组概念来解决这些问题,

1.指定Vector的基本类型

如Vector<int>表示一个Vector,其元素是整型。

Vector<char>表示一个Vector,其元素是单个字符

Vecotr<string>表示一个Vector,其元素是字符串。

尖括号里的类型,就表示为指定容器类的基本类型(Base Type)。

这种类中包含指定的基本类型在面向对象社区中称为参数化的类。在C++中,参数化的类另外称为模板(templates)。这反映了C++编译器把Vector<int>,Vector<char>,Vector<string>作为独立的类来共享共同的结构。

2.声明一个Vector对象

抽象数据类型背后的一个哲学原理是让Client认为它们就是内置的原始类型,就像如下声明一个整型变量一样

int n;

声明一个新的Vector变量写为:

Vecotr<int> vec;

在C++中,该声明的新变量vec,表示是一个整型的Vector。

3.Vector操作

1)add操作

当声明一个Vector变量时,其为一个空的Vector,表示它不包含任何元素,由于空的Vector并没有用,因此,首先我知道的是如何向Vector变量中加入元素。常用的方法是调用add方法,该方法是在Vector尾部加入一个新的元素。

例如,若vec是一个空的整型Vector,执行如下加入元素操作:

vec.add(10);

vec.add(20);

vec.add(40);

这样,vec中就包含了10,20,40这3个元素。现在vec看起来如下:

跟原始的数组类型不同,Vector类的大小不是固定的,这意味着我们在任何时候加入其它元素。例如,现在我们再加入一个元素:

vec.add(50);

此时,加入50到vec的尾部,如下:

2)insertAt方法

该方法允许在一个Vector类的中间位置加入一个元素,insertAt方法的第一个参数为索引号,其表示在该索引号位置前插入一个新元素,例如:

vec.insertAt(2, 30);

表示在位置2之前插入一个值30,执行该语句后,如下:

3)removeAt方法

该方法表示从Vector变量中删除一个元素,例如:

vec.removeAt(0);

表示删除位置0处的元素,执行该语句后,如下:

4)get方法和set方法

get方法和set方法用来选择和修改各个单独的元素,get方法通过一个索引号获取该索引位置的值。例如,对于上面最近显示的vec变量中的值。调用

vec.get(2)

将返回40。

相应地,可以使用set方法来改变已经存在的元素的值,例如,调用

vec.set(3, 70);

其改变索引位置3的值50为70,如下:

get、set、insertAt和removeAt方法都会检查给其提供的索引值必须是有效的。例如,对于上面最近显示的Vector,若调用vec.get(4),则会有调用错误,因为索引值4太大了,因为vector的索引值从0~3。

这种检查索引值的操作是否有效的操作,称之为边界检查。边界检查可以更容易的获取到那些不容易注意的程序错误

4.选择Vector中的元素

尽管get和set方法容易使用,但并不是每个人都调用这些方法。

C++的一个特性是其定义的类可以重载标准操作符的定义。这让Vector类支持更多传统的使用方括号来指定要访问的索引的值的语法。

因此,选择位置i处的元素,可以使用表达式vec[i],就像访问传统的数组一样。

另外,可以通过赋值一个新的值给vec[i]来改变位置i处的值。可以通过如下:

vec[3] = 70;

来设置索引值3的处为70。

最常用的索引表达式之一就是for循环中的索引,其按序循环各个索引值。循环Vector中的索引位置的通常模式如下:

for(int i = 0; i < vec.size(); i++)
{loop body
}

在循环实体内,可以应用当前的元素vec[i]。

例如,如下的代码把Vec变量中的内容,以方括号括起来,元素之间用逗号隔开来显示

cout << "[";
for(int i = 0; i < vec.size(); i++)
{if(i > 0) cout << ",";cout << vec[i];
}
cout << "]" << endl;

执行该段代码的输出结果将如下:

[20,30,40,70]

5.传递Vector对象作为一个参数

对于上面的打印Vector变量中的元素值使用的非常频繁,因此,可以把其定义为一个函数,后面若使用,直接调用该函数即可,那么在定义函数时,就涉及了Vector变量传递给函数参数的问题,一般Vector变量作为函数参数的定义如下:

void printVector(Vector<int> &vec)
{cout << "[";for(int i = 0; i < vec.size(); i++){if(i > 0) cout << ",";cout << vec[i];}cout << "]" << endl;
}


&表示此处参数通过引用来调用,

在C++中,引用调用比传值调用更有效,因为传值调用要求复制vector中的每个元素。

在printVector函数中,并没需要进行复制,所以引用调用是一个更加有效的设计。

引用调用的一个更加重要的特性就是可以直接改变Vector变量中的内容,例如,使用如何函数删除元素值为0的项。

void removeZeroElements(Vector<int> &vec){for(int i = vec.size() - 1; i >= 0; i--)if(vec[i] == 0)vec.removeAt(i);}
}


6.创建一个预先定义大小的Vector

到目前为止的例子,都是创建一个空Vector变量,然后一次加入一个元素到里面。然而,若提前知道要创建的vector变量的大小,则可以在声明时指定元素个数。如下代码:

const int N_HOLES = 18;
Vector<int> golfScores;
for(int i = 0; i < N_HOLES; i++)
{golfScores.add(0);
}

一个较好的方法是在声明的时候包含一个大小的参数,如下:

Vector<int> golfScores(N_HOLES);

该声明创建一个Vector<int>变量指定大小为N_HOLES个元素,各个元素初始化为0.

转载于:https://www.cnblogs.com/snake-hand/p/3206532.html

相关文章:

linux编译安装mysql 5.1_linux编译安装mysql5.1.x

安装mysql&#xff0c;安装前准备如果mysql用户不存在&#xff0c;那么添加mysql用户groupadd mysqluseradd -g mysql mysqlmysql编译安装make时间特别长wget http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.70.tar.gztar -zxvf mysql-5.1.70.tar.gzcd mysql-5.1.70…

Windows PowerShell 批量迁移Windows用户信息

这里说一下我在服务器上本地用户帐号、组的迁移 这里用到的迁移工具是 Windows PowerShell 迁移支持虚拟机和实体机器的迁移&#xff0c;虚拟机和虚拟机的迁移 但是不支持不同语种之间的迁移&#xff0c;比如英语向中文迁移 这里我实验的是虚拟机和虚拟机的迁移 系统是Windows…

css中position的几个值

1. staitic:该值符合文档的初始排版&#xff0c;其中设置的与位置有关的值不起作用。2.relative 该值的偏移量&#xff0c;是在文档初始排版的基础上进行排版&#xff0c;并且覆盖顺序是最新输出的在最上面3.absolute该值元素的定位是以网页文档左上角位基准&#xff0c;并且不…

一个较为详细的ETL系统实现方案

转至&#xff1a;http://www.cognoschina.net/club/viewthread.php?tid5627 1 ETL流程及调度设计&#xff08;ETL Schedule&#xff09;(PSP)1. ETL调度的目标快速见效系统要抽取39家分行四个系统的数据进行加工处理&#xff0c;数据从下传文件到ODS库&#xff0c;ODS库到LDM&…

python与anaconda区别_anaconda和python的区别是什么?

anaconda和python的区别是什么&#xff1f;Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。使用python需要下载安装执行python代码的环境。官方的Python包含了核心的模块和库&#xff0c;为了完成其他任务&#xff0c;需要安装其他的模块和库。Anaconda 是Py…

opencv 1 图像载入、显示和输出

三个函数 imread() namedWindow() inshow()1. imread 函数原型&#xff1a; Mat imread(const string& filename, int flags 1 );参数解析&#xff1a; const string& finename 将要载入的图片路径名。 Windows操作系统下面支持如下类型的图片&#xff1a; Window…

英文申请书范例

Dear Sir or Madam, I am applying for the position of Executive Assistant as advertised in the Recruitment Daily last evening. 我来应聘昨天晚上在每日招聘上发布的行政助理一职。 I have over five years of experience within this role during which time I have de…

c++ ofstream使用方法

ofstream是从内存到硬盘&#xff0c;ifstream是从硬盘到内存&#xff0c;流缓冲即是内存空间。 插入器<< : 向流输出数据。 cout << "test!" << endl; 将字符串输出到标准输出流。 析取器>> : 从流中输入数据 cin >> x; 从标准输入流…

JAVA 继承内存模型_Java内存模型

JVM的组成类加载器(classloader)执行引擎(execution engine)运行时数据区域(runtime data area)对于Java程序员来说&#xff0c;在虚拟机自动内存管理机制下&#xff0c;不再需要像C/C程序开发程序员这样为内一个new 操作去写对应的delete/free操作&#xff0c;不容易出现内存泄…

Error: The INF file contains Unicode characters that could not be converted correctly

昨天第一次为自己的windows mobile程序制作CAB安装包&#xff0c;但是在生成过程中&#xff0c;却出现了这样一个问题&#xff1a;编译完成 -- 0 个错误&#xff0c;0 个警告time -> G:\WindowsMobile\time\time\bin\Debug\time.exe------ 正在启动项目“SmartDeviceCab1”的…

嵌入式开发板设置无密码登录

本次配置需要修改的ssh登录的配置文件 vi /etc/ssh/sshd_config允许root用户远程登录 设置PermitRootLogin参数值为yes #LoginGraceTime 2m PermitRootLogin yes #StrictModes yes #MaxAuthTries 6 #MaxSessions 10允许无密码登录 设置PermitEmptyPasswords 参数值修改为ye…

2012/08/27 夜

杂记于2012/08/27 唉&#xff0c;&#xff0c;最近公司在搬家&#xff0c;一直没有时间来看技术方面的资料&#xff0c;丫的上个星期天还接到第二天凌晨3点钟呢。。。唉。。有点受不了啊。。这苦逼的运维工作&#xff0c;&#xff0c;&#xff0c;呵&#xff0c;来说说这其中让…

存储过程和函数 PROCEDURE FUNCTION

SQL语句执行的时候&#xff0c;要首先编译&#xff0c;然后在被执行。在大型数据库系统中&#xff0c;为了提高效率&#xff0c;将为了完成特定功能的SQL语句集进行编译优化后&#xff0c;存储在数据库服务器中&#xff0c;用户通过指定存储过程的名字来调用执行。 具体而言&am…

Android——学习:线性布局权重分配

LinearLayout在Android中被广泛使用&#xff0c;LinearLayout有一个比较重要的属性——android:layout_weight。按照字面理解就是该控件的权重&#xff0c;这个值默认是 零&#xff08;0&#xff09;。 举个例子&#xff1a; 在下图中&#xff0c;整个界面是一个Linearlayout&a…

java bean配置文件_Spring中多配置文件及引用其他bean的方式

Spring多配置文件有什么好处&#xff1f;按照目的、功能去拆分配置文件&#xff0c;可以提高配置文件的可读性与维护性&#xff0c;如将配置事务管理、数据源等少改动的配置与配置bean单独分开。Spring读取配置文件的几种方式&#xff1a;1、使用Spring自身提供的ApplicationCo…

putty 串口登录开发板

安装putty 多个平台均可以安装putty pc端配置 使用串口线连接开发板 ls /dev 查看是否出现类似于ttyUSBx的文件 sudo putty 弹出页面&#xff0c;选择Serial Serial line填写/dev/ttyUSBx Speed填写115200(根据不同开发板&#xff0c;选择不同参数) 依次点击Load&#xff0…

win7下解决Android SDK Manger慢

2019独角兽企业重金招聘Python工程师标准>>> 今天准备做个Android小程序&#xff0c;以前配置的环境太久了&#xff0c;于是想配最新&#xff0c;但是花了大半天的时间遇到各种问题&#xff0c;最终还是配置好了。 1、首先修改C:\Windows\System32\drivers\etc\host…

Linux 工具进阶

参考网址 https://linuxtools-rst.readthedocs.io/zh_CN/latest/advance/index.html 转载于:https://www.cnblogs.com/artesian0526/p/9712258.html

ASP.NET MVC:利用ASP.NET MVC4的IBundleTransform集成LESS

背景 LESS确实不错&#xff0c;只是每次写完LESS都要手工编译一下有点麻烦&#xff08;VS插件一直没有安装好&#xff09;&#xff0c;昨天在官方看到了如何用IBundleTransform集成LESS&#xff0c;今天就记录一下。 参考资料&#xff1a;http://www.asp.net/mvc/tutorials/mvc…

java锁屏_JAVA设置桌面不锁屏设置

//下面是编译命令// javac -encoding utf-8 Main.javaimport javax.swing.*;import java.awt.*;import java.awt.event.*;public class Main extends WindowAdapter {JLabel label null;public Main() {JFrame jFrame new JFrame("保持打开就不会锁屏");Container …

网线直连开发板

pc 端配置 点击pc端无线链接图标编辑链接以太网编辑IPv4设置方法&#xff1a;与其他计算机共享根据putty获取的动态ip使用ssh登录 解决 ip 无法登录问题 设置 pc 端 ip 和开发板 ip 在同一个网段 比如开发板 ip 是 10.42.0.123 可以设置自己机器的 ip 为 10.42.0.11 sudo i…

linux系统中指定端口连接数限制

限制22端口只能有两个连接 [code] iptables -P INPUT DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT iptables -A INPUT -p tcp --dport 22 -j ACCEPT [/code] 在此…

PHP-错误处理

错误处理 一、错误的分类 1、语法错误&#xff1a; 程序没法运行&#xff0c;直接提示语法错误。 2、运行时错误&#xff1a; 只有程序运行到某行&#xff0c;或在某些特定的情形下运行才会发生的错误。 3、逻辑错误&#xff1a; 程序从头到尾运行都没有发生&#xff08;并提示…

C语言的变量的内存分配

今晚看了人家写的一个关于C语言内存分配的帖子&#xff0c;发现真是自己想找的&#xff0c;于是乎就收藏了。。。 先看一下两段代码&#xff1a; char* toStr() {char *s "abcdefghijkl";return s; } int main() {cout << toStr() << endl;return 0; }…

java打包_java工程打包(方式一)

1、新建工程myprojectpackage cn.zj;public class TestMain {public static void main(String[] args) {System.out.println("Hello World!");}}2、右击Java工程选择Export—>选择JAR file—>Next3、选择要打包的文件&#xff0c;不需要的文件不必打包&#xf…

s32v 开发板安装 apex 驱动

安装驱动 首先要获取到 apex.ko 文件&#xff0c;这个应该是硬件厂商提供&#xff0c;执行下面命令安装 首先需要给 apex.so 文件加上可执行权限 insmod apex.ko查看是否安装成功 执行下面命令&#xff0c;查看是否安装成功&#xff0c;如果安装成功&#xff0c;执行的结果中…

android常见错误与问题

1. Unable to start activity ComponentInfo 原因有很多种&#xff0c;我碰到一种&#xff1a; 可能是当前Activity里引用的View&#xff0c;并不存在于绑定的Layout里&#xff0c;而是在其他的Layout里&#xff0c;在Copy代码的时候&#xff0c;常会发生这种问题。

链式前向星(模板)

一种非常厉害的存图的数据结构&#xff01; 本质&#xff1a;模拟链表的操作&#xff0c;链式存储图。&#xff08;2&#xff0c;3都可以模拟链表的操作&#xff0c;替代链表&#xff09; &#xff08;1&#xff09;二维数组存图&#xff1a;Map[x][y]&#xff0c;一维代表出发…

tar 打包问题

项目中使用到 tar 文件&#xff0c;同一个 tar 文件解压之后在压缩&#xff0c;在程序执行的时候不能使用了 原因是 tar 对文件名长度有限制&#xff0c;当文件名过程的时候&#xff0c;使用 --formatustar 进行压缩

QT webkit学习笔记(2)

五、QWebDataBase Class介绍 QWebDataBase提供了对基于JavaScript创建的HTML 5数据库。新一代的HTML 5标准也提供对基于javaScript SQL数据库访问的支持。QWebDataBase就是这些数据库的C接口。关于HTML 5的详情&#xff0c;可以参见HTML 5 Draft Standard. 六、QWebHistory Cla…