C++容器类型

原创 2015年07月08日 11:54:27

这两天看了一下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.指向整型数组的指针与指向整型的指针是不一样的,一维整型数组的数组变量是一个指向数组首元素也即整型元素的指针,二维整型数组的数组变量是一个指向一维整型数组的指针,指向的对象有着本质的区别,在使用时要谨慎对待


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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C++ vector容器类型

转载自:http://www.cnblogs.com/charley_yang/archive/2010/12/11/1903040.html   vector类为内置数组提供了一种替代表示,与s...

C++ vector容器类型及初始化方法

vector类为内置数组提供了一种替代表示,与string类一样 vector 类是随标准 C++引入的标准库的一部分 ,为了使用vector 我们必须包含相关的头文件  : #include ...

网上的好文章:C++ vector容器类型及初始化方法

http://www.cnblogs.com/charley_yang/archive/2010/1 网上发现的一片好文。vector类为内置数组提供了一种替代表示,与string类一样 vecto...

C++ vector容器类型

转载自:http://www.cnblogs.com/charley_yang/archive/2010/12/11/1903040.html vector类为内置数组提供了一种替代表示,与st...

C++ STL中顺序容器类型以及实现原理

1.顺序容器类型

【C++ Primer】【学习笔记】【第十章】关联容器之:map类型

使用map对象,则需要包含map头文件。在定义map对象时,必须分别指明键和值的类型。 一、map对象的定义 map的构造函数如下: 构造函数 ...

简明python教程 --C++程序员的视角(四):容器类型(字符串、元组、列表、字典)和参考

数据结构简介 Python定义的类型(或对象)层次结构在概念上可以划分为四种类别:简单类型、容器类型、代码类型 和内部类型。 可以将 PyObject 类之下的所有 Python 类划...

c++ primer学习之--------抽象容器类型

顺序容器(sequnce container)拥有由单一类型元素组成的一个有序集合。两个主要的顺序容器是list和vector,还有一个deque(提供了与vector相同的行为,但是对于首元素的有效...

从一道题谈C++容器内元素的类型约束

《C++ primer》第四版中文267页,9.1.2元素类型必须支持赋值运算。元素类型的对象必须可以复制。不久前我复习的时候还标记了一下,没想到理解得还不深刻啊。。

C++ vector容器类型

vector类为内置数组提供了一种替代表示,与string类一样 vector 类是随标准 C++引入的标准库的一部分 ,为了使用vector 我们必须包含相关的头文件  : #include ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)