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++容器存放不同结构的数据

本来想在c++容器里面存放不同的结构体,但是没有实现,最后通过子类父类的互相转换实现。 只要将建立一个基类的容器就可以直接push子类,这样就实现了一个可以用插入不同数据结构的容器。 1、将不同的...
  • cxc233
  • cxc233
  • 2017年08月27日 01:04
  • 350

C++制作一个泛型容器(可以盛放各种类型的对象)

如果你想要一个可以盛放各种类型的对象,那么基本上可以说在C++里没有,或者你可以用vector或者其他的什么来模拟,我说那都不怎么好。问题就在于我的类型会在运行时动态的增加,你不可能知道我会增加什么类...
  • ClamReason
  • ClamReason
  • 2014年05月04日 16:58
  • 1807

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

C++ vector容器类型及初始化方法转自: http://imatlab.lofter.com/post/286ffc_a81276 http://www.cnblogs.com/charle...
  • zxc995293774
  • zxc995293774
  • 2015年08月06日 09:42
  • 3939

C++STL::两种方式实现STL容器的reference语义

使用智能指针使用reference wrapper
  • lanchunhui
  • lanchunhui
  • 2015年11月17日 09:44
  • 628

C++各种容器小结

在C++标准中,STL被组织为下面的17个头文件:、、、、、、、、、、、、、、、和。...
  • SkySuperWL
  • SkySuperWL
  • 2016年08月06日 17:33
  • 1273

C++STL中常用的容器下标[]运算

在C++STL中常用的容器和类型,下面哪些支持下标"[]"运算? 正确答案: A C D F I   你的答案: B H I (错误) vector list ...
  • Stand1210
  • Stand1210
  • 2016年09月09日 18:27
  • 1006

c++标准库中各种容器的介绍

这篇文章最早发布于关门2000的博客(www.gscience.cc)中,若转载请注明 顺序容器: array(数组)是一种最简单的标准库容器,定义于头文件中: array的功能基本与普通的C数组,性...
  • gth2001
  • gth2001
  • 2017年02月09日 11:35
  • 604

c++顺序容器定义和初始化

一、顺序容器的定义         容器是容纳特定类型对象的集合。这种容器根据位置来存储和访问元素。就是顺序容器 二、容器适配器    根据原始的容器类型所提供的操作,通过定义新的操作接口,...
  • u012730315
  • u012730315
  • 2015年04月15日 18:54
  • 1564

C++ string容器的用法 学习笔记

C++STL提供了string基本字符系列容器来处理字符串,可以把string理解为字符串类,他提供了添加删除,替换,查找和比较等丰富的方法;   虽然使用vector 这样的向量也可以处理字符串...
  • u012823258
  • u012823258
  • 2014年01月16日 13:47
  • 1848

【C++】STL常用容器总结之一:容器与迭代器

声明: 1、本博文主要整理自《C++ Primer》和《STL源码剖析》这两本经典书籍。同时,也参考了网络中不少优秀博客,对这些博客的作者表示感谢。 2、由于博主能力有限,对于一些容器的用法可能尚...
  • hero_myself
  • hero_myself
  • 2016年08月24日 22:46
  • 2952
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++容器类型
举报原因:
原因补充:

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