0525_C++ vector与数组

以下为vector容器相关:

  • vector能够容纳大多数类型的对象作为元素,除了引用,因为引用不是对象。甚至组成vector的元素也可以是vector。
  • vector初始化

vector<T> v1

v1是一个空vector,潜在元素类型为T,执行默认初始化

vector<T> v2(v1)

v2中包含有v1中所有元素的副本

vector<T> v2=v1

等价于上一个

vector<T> V3(n,val)

v3包含了n个重复元素,每个元素的值为val

vector<T> v4(n)

v4包含了n个重复执行默认初始化的对象

vector<T> v5{a,b,c…}

 v5包含了初始值个数的元素,每个分别为……

vector<T> v6={a,b,c…}

等价于上一个

 

  • 还可以通过列表初始化,举例如下
vector<string> articles={"a","an","the"}

使用拷贝初始化时只能提供一个初始值;提供一个类内初始值,只能只用拷贝初始化或者花括号形式初始化;如果提供的时初始值元素列表,只能用花括号,不能用括号。

 

创建指定数量的元素

vector<int> ivec(10,-1);//创建10个每个都被初始化为-1

vector<string> svec(10,"hi");//创建10每个都被初始化为hi

注意,可以只定义初始化个数,初始化的值可以默认,int为0,string为空对象。记住,

vector<int>(10);//括号内为元素个数,该例为10个默认初始化元素

vector<int>{10};//花括号为初始化的值,该例含义为一个对象初始值为10

类型为string时要特殊考虑。

 

  • vector的相关操作

v.empty()

如果v不含有任何元素,返回真;否则返回假

v.size()

返回v中元素的个数

v.push_back(t)

向v的尾端添加一个值为t的元素

v[n]

返回v中第n个位置上元素的引用

v1=v2

用v2中元素的拷贝替换v1中的元素

v1={a,b,c,……}

用列表中元素的拷贝值替换v1中的元素

v1==v2

v1和v2相等,当且仅当他们的元素数量相同且对应位置的元素值都相同

v1!=v2

不等时返回真

<,<=,>,>=

按字典序比较

vector对向的下标运算可以用于访问已经存在的元素,而不能用于添加元素。

 

  • 解引用成员访问可以使用->来简化,例如

(*it ).men()与it->men相同。

 

  • 不能使用范围for向vector中添加元素;任何一个可能改变vector对象容量的操作都会是该vector对象的迭代器失效。即凡是使用了迭代器的循环体都不要向迭代器所属的容器添加元素。

 

==============================================================================

以下为数组相关:

  • 不允许一个数组直接赋给另外一个数组。字符串数组声明时需要考虑隐含的空白符作为结尾。

 

  • 复杂数组声明
int  *ptrs[10];                               //ptrs是数组,含有10个整形指针的数组

itn  &refs[10]=/*?*/;              //错误,不存在引用的数组

int  (*Parray)[10]=&arr;          //Parray是指针,指向一个含有10个整数的数组

int  (&arrRef)[10]=arr;             //arrRef是一个引用,引用一个含有10个整数的数组

int  *(&arry)[10]=ptrs;               //arry是数组的引用,该数组有10个指针

//判断数组声明的含义,从内向外,从右向左。

 

  • 定义在函数体外的int数组初始化为0;函数体内定义int数组初始化随机数。

 

  • 允许使用数组来初始化vector对象。要实现这一目的,只需指明要拷贝区域的首元素地址和尾后地址即可。

int arr={0,1,2,3,4,5,6};

vector<int> vec(begin(arr),end(arr));

注意end(arr)指向arr最后一个元素的后一个位置,即可以写成

vector<int> vec(arr,arr+7)

 

  • string.h的常用函数

strlen(p)

返回p的长度

strcmp(p1,p2)

比较p1和p2的相等性,p1==p2返回0;p1>p2返回正数;p1<p3返回负数

strcat(p1,p2)

把p2附加到p1后,返回p1

strcpy(p1,p2)

将p2拷贝给p1,返回p1

传入此类函数的指针必须指向以空字符作为结束的数组。

char ca[ ]={‘c’,‘+’,‘+’};//没有以空字符做结尾

cout<<strlen(ca)<<endl;//严重错误,ca没有空字符结尾。

 

  • 字符串的比较结果:string对象的比较的是字典序,存在大小关系;字符串数组比较的是两个无关的地址,如果想要比较两个数组字符串,需要strcmp函数。

 

  • string中还有一个返回字符串数组的函数,便于处理string与字符数组的运算
string s(“hello world”);

const char  *str=s.c_str();//c_str()返回一个字符串数组。

 

  • 数组与指针容易引起访问非法位置,尽量使用vector和迭代器还有string对象。

严格来说,c++没有多维数组,只有数组的数组。

使用范围for处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值