c++primer 第三章数组 string vector

来源:互联网 发布:半张量积 网络编码 编辑:程序博客网 时间:2024/04/29 04:19

命名空间的using声明

使用using格式:
  using namespace::name;
  example:
   using std::cin;
头文件不应包含using声明

3.2 string
3.2.1 定义和初始化
方式:
string s1;//默认初始化,其为一个空串
string s2=s1;
string s3(s1);//yus2 相同
string s4=“anbadfa”;
string s5(n,’c’);
对于多个值初始化最好使用直接初始化而不是拷贝初始化
3.22string对象上面的操作
s.empty();
s.size();
s[n];
s1+s2;
getline(is,s);
s1=s2;
s1==s2;
<,>,<=,>=
读取未知数量的string对象:
string s;
while(cin>>s)
cout<< s;
使用getline读取一行
getline(cin,s);
string::size_type类型
它是一个无符号类型,用了size()就不要再用int了
比较string对像:字典顺序
1.如果两对象长度不同,较短对象每个字符与较长对象对应位置字符都相同,较短对象小于长的、
2.如果字符不同,比较结果是第一对对应位置相异的字符的比较结果
string对象的赋值 、相加;相加应确保至少有一个是string

由于历史原因,字符串字面值并不是string类型
处理string对象中的字符
#include 中定义的函数:
isalnum(c);
isalpha(c);
iscntrl(c);
isdigit(c);
isgraph(c);
isprint(c);
islower(c);
isupper(c);
isspace();
ispunct(c);
isxdigit(c);
tolower(c);
toupper(c
将c语言中的name.h改为C++的cname;并且在名称空间std中

3.3vector 她是一个类模板
编译器根据模板创建类或者函数的过程称为实例化
初始化:
1. vector v1;
2. vector v2(v1);
2. vector v2=v1;
3. vector v3(n,val);
4. vector v4(n);
5. vector v5{a,b,c,..};
5. vector v5={a,b,c,..};
必须使用直接初始化制定向量大小
vectorvi(10);//10个元素每个都是0;
vectorv2{10};//1个元素10;
vectorv3(10,1)//10个1;
vectorv4{10,1};//10he 1
圆括号是来构建对象的,花括号是来初始化值的;
操作
v.push_back(t);
v.size();
v.empty();
v[n];
v1=v2;
v1!=v2;
v1={a,b,c,…}
<,<=,>,>=比较与string相同
试图用下表访问一个不存在的元素将不会被编译器发现,而是运行时产生一个不可知值,也即缓冲区溢出;
解引用和成员访问结合的操作:->;
*凡是使用了循环体的迭代器都不要向该迭代器所属的容器添加元素
*两个迭代器的差值是一个difference_type的带符号整形数

数组

不清楚元素个数请使用vector
声明为constexpr的变量一定是常量表达式
初始化数组
int arr[10];//含有10个元素的数组
int *parr[10];//含有10个整形指针的数组
和内置类型一样,如果在函数内部定义了某种内置类型的数组,那么默认初始化会令数组含有未确定意义的值
*定义数组必须指定数组类型,不允许使用auto关键字由初始值的列表来推断类型
*显式初始化数组
* 字符数组的特殊性
可以使用字符串字面值来初始化字符数组:但是字符串字符数量+1不能大于数组容量
数组不允许拷贝和赋值
理解复杂的数组声明
int * ptr[10];//含有10个整形指针的数组
不存在引用的数组
int (*parray)[10]=&arr ;//parry指向一个含有10个int的数组
int &ref[10]=…;/./错误
int (&arrRef)[10]=arr;//引用一个含有10个int的数组
默认情况下类型修饰符是从右向左依次绑定,从右向左表较好理解她的含义;但是对于数组应该从数组名开始从内向外理解声明的含义
* 数组除了固定大小以外其他用法与vector基本类似
* 使用数组下标的时候同常把它定义为size_t类型。这是一种机器相关的无符号类型,定义在cstddef
* 检查下标的值
**大多数安全问题源于缓冲区溢出,当数组或其他类似数据结构的下标越界并试图访问非法内存区域时,就会产生此类错误
指针和数组关系密切,使用数组时编译器一般把它先转换成指针
在一些情况下数组的操作实际是指针的操作,当用数组作为auto变量的初始值时,推断得到的是类型是指针而非数组,
int a[]={1,2,4,4,5};
auto ia(a);//ia是一个整形指针,指向a的第一个元素;
使用decltype时上述转换不会发生
decltype (a) ia={1,4,6,7};
ia=p;//错误,不能把一个指针你给数组赋值
ia[1]=10;//zhengque
**使用数组名或者第一个元素的地址可以得到首指针,尾后指针可以这样得到:
int * e=&a[10];//假设数组a有10个元素
标准库函数begin 和end,定义在iterator头文件
int ia[]={0,1,2,3,4,5,6,7,8,9};
int * beg=begin(ia);
int *last=end(ia);
数组指针相减是一个ptrdiff_t的无符号类型的
数组的内置下表运算可以处理下标为负的情形,负值就是向前移动
c风格字符串:定义在cstring头文件
字符串字面值是一种通用的结构实例,这种结构是c++从c继承而来的c风格字符串,以空字符结束\0
一般使用指针来操作这些字符串
strlen(p);
strcpy(p1,p2)
strcmp(p1,p2);、、相等返回0,p1>p2返回正值,否则返回负值
strcat(p1,p2);
当使用数组的时候实际使用的指向数组首元素的指针
与旧代码的接口
1. 允许使用字符串字面值初始化string对象
2. 任何出现字符串字面值的地方都可以使用以空字符结束的字符数组来代替
3. 允许使用以空字符结束的字符数组来初始化string对象或为string对象赋值
4. 在string对象的加法运算中允许使用以空字符结束的字符数组作为一个运算对象(不能两个对象都是,并且应该在右边)
5. 上述性质反过来不成立,即如果要处理c风格字符串,则不能用string来代替
如:不能用string对象直接初始化指向字符的指针,为完成该功能可以使用c_str()成员函数
char * str=s;//错误,不能用string初始化char*
const char * str=s.c_str(); //正确
尽量使用string、vector和迭代器,避免使用数组、指针、c风格字符串

多维数组

严格来说,c++没有多维数组,通常所说的多维数组是数组的数组
第一个维度代表数组本身大小,第二个维度代表元素大小
初始化:
int ia[3] [4] ={
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
};
等价于:
int ia [3][4] ={0,1,2,3,4,5,6,7,8,9,10,11};

0 0
原创粉丝点击