C++容器类型

这两天看了一下c++prime的第三章,逐步了解了一下c++标准库中定义的容器类型,重点是string和vector,还附带讲解了一点有关数组的知识点。


标准库类型string

标准库类型string表示可变长度的字符串序列,是c++标准库中定义的类类型。string类型的对象可以采用以下方式进行定义和初始化:


string str1 //默认初始化,str1是一个空字符串

string str2=“abcdef”//拷贝初始化,str2是一个长度为6的字符串(舍去了空字符)

string str3=str1//拷贝初始化,str3是str1的一个副本

string str4(“abcdef”)//直接初始化

string str5(str4)//拷贝初始化,str5为str4的副本

string str6(10,'c')//直接初始化,str6是包含10个c的字符串


直接初始化是创建对象时采用初始化列表里的值对对象进行初始化

拷贝初始化是用初始化列表里的对象的值创建一个新的对象


在string类型上可以进行许多操作,包括集合类对象最基本的读写、判断是否为空、获取字符串长度、下标索引元素。另外对于c++的标准库库类型string对象,还可以进行字符串的拼接(‘+’运算符)、string对象的复制('='运算符)、判断是否相等(“==”,”!=“)、安字典顺序比较大小。


注意事项:

1.string对象的size函数调用返回一个标准库中定义的size_type类型,这是一个无符号类型,支持任意长度字符串

2.string对象可以和string对象想加,可以和字符串字面值相加(依赖类型转换,会舍弃空字符),但是不能将两各字符串字面值相加


标准库类型vector

vector库类型表示对象的集合,可以看作是string类型的一个拓展,它不再限于字符串类型。vector是c++标准库定义的一个模板类,支持各种类型对象的实例化。vector也支持类似与string对象的多种定义和初始化方式,只是要求初始化列表与类型严格匹配。值得一提的是初始化过程中“( )”和“{ }”的问题:


vector<int> a;//定义一个整型vector对象a,默认为空,没有元素

vector<int> a(10);//定义了一个整型vector对象a,其中含有10个元素,都默认初始化为0;

vector<int> a{10};//vector对象a,其中含有一个元素,即10;

vector<int> a(10,1);//vector对象a含有10个元素,都为1

vector<int> a{10,1};//vector对象a含有两个元素10和1

当编译器看见“{}“中的初始值烈表时,首先考虑作为元素初始值,其次考虑作为对象的元素数量。


注意事项:

1.”()“中的初始值只能用来指定被创建vetcor对象的大小,而不能用来指定元素值

2.一般采用默认初始化来创建vector对象,这样便于后期对于元素的增加、删除操作


vector上可进行的操作与string上可进行的操作十分相似,都支持迭代器访问,并且迭代器访问是一种既安全对于程序员来说又高效的访问方式。


迭代器类型iterator

迭代器类似于指针类型,提供了对于对象的间接访问:

vector<int>::iterator  p;//p是一个整型的迭代器对象,指向整型vector中的某一个元素,或者为空

auto p=a.begin();//p指向a的第一个元素,

auto q=a.end();//q指向a的最后一个元素的下一个位置,即不指向a中的具体对象


迭代器的运算和指针的运算类似,可以进行解引用和成员访问,也可以整数进行算术运算,其实质是改变迭代器所指向vector对象中的的位置。


注意事项:

1.切勿在迭代过程中改变vector容器的大小,这样会使迭代器失效

2.标准库中定义的函数begin()和end()可以用来为数组生成迭代器


多维数组

关于多维数组需要明白的有两点:

1.多维数组的定义与初始化

int a[3][4];//定义二维数组a,a中的每一个第一维元素是一个4个元素的整型数组,第二维的元素是整型对象

int a[2][2]={{0,0},{1,1}};//定义并初始化二维数组a,其中第一维的第一个元素是含有两个整型元素0和0的数组

int a[2][2]={0,0,1,1};//同上

编译器会根据第二维度的大小来初始化数组,所以可以不提供第一维度的大小,也可以不完全提供初始值,未获得初始值的元素执行默认初始化

阅读多维数组定义最好从内而外读起.一层一层按照数据类型定义规则抽丝剥茧地对多维数组的定义进行解析


2.对于数组的操作一般转换为对于指针的操作

int a[3][4];//当使用a时,其实是使用一个指向由四个整型元素组成的数组的指针,在此a向第一维度的第一个元素,也即第一个整型数组

//当使用*a时实际上是使用一个具有四个整形元素的数组,所以*a是一个指针,指向这个整型数组的第一个元素

注意事项:

1.指向整型数组的指针与指向整型的指针是不一样的,一维整型数组的数组变量是一个指向数组首元素也即整型元素的指针,二维整型数组的数组变量是一个指向一维整型数组的指针,指向的对象有着本质的区别,在使用时要谨慎对待


关于容器类型和迭代器的使用其实归根结底与指针的使用密切相关,只要熟悉指针的用法,那么使用迭代器访问容器类型对象也是一件很容易的事情,究其原因就是容器类型和迭代器是通过底层的数组和指针实现的,但是大多数时候,使用高层次一点的容器类型和迭代器比使用低层次的数组和指针要更安全、更方便。可根据具体情况选取适当的数据类型进行算法设计和代码编写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值