(2)c++学习笔记--字符串,向量和数组

string
  1. string.size()函数,返回值是自定义的size_type类型,它至少是unsigned,所以要注意与int用在一个表达式的时候。
  2. 字面值和string对象相加的时候,必须确保+号两侧至少有一个是string对象。
//这就是错误的,都是字面值
string str = "hello ," + "world!";

3 .c++版本的c标准库头文件,比如c中ctype.h,在c++中是cctype
4. 遍历string

//将str小写转大写,遍历的同时要修改,必须用&
string str("hello, world!")
for(auto &c : str){
    c = toupper(c)
}

5 . string: 下标遍历和迭代器遍历

vector
  1. vector: 一个容器,里面的对象类型一致。c++有类模板和函数模板,vector是类模板,模板本身不是类或函数,而是编译器生成类或函数的说明。
  2. 不存在包含引用的vector,因为引用不是对象。
  3. 初始化:
vector<int> v1{10}; //10个int,每个都为0
vector<String> v2{10}; //因为10是int,不是string,所以这里会处理成(10)

4 . 添加元素:push_back(),有一点需要尤其注意,在c或者Java中创建对象时指定容量更好,但是c++中不是,为了高效的添加元素,不指定容量更好,只有一种情况是例外,就是每个值都一样。
5 . 不能再范围内循环的时候改变vector的大小。

vector<int>::size_type //正确
vector::size_type     //错误 

6 . i++ 和 ++i: 如果不看返回值,意思是一样的,如果有返回值:

int i = 3;
int a = ++i;   //b=4,i=4
int i = 3;
int b = i++;   //b=3,i=4

7 . 尾迭代器:begin和end,begin指向的是第一个元素的迭代器,但是end指向的是最后一个元素的下一个位置的迭代器,这个位置是一个标志位,如果为空,begin和end指向的一样,都是尾迭代器。

vector<int> v;
auto it1 = v.begin();  //it1的类型是:vector<int>::iterator
auto it2 = v.end(); //it2的类型是:vector<int>::const_iterator
//如果对象只需要读而无需写的话,用const_iterator比较好,所以c++提供了cbegin()和cend(),无论vector对象是否是常量,都返回const_iterator

8 . 箭头运算符 -> ,就是把解引用和成员访问结合在一起了。

(*it).empty();   //it是一个迭代器,两行代码效果一样
it.empty(); 

9 . difference_type: 两个迭代器之间的距离。

iterator可以进行算术运算,所得到的的结果类型为difference_type

数组
  1. 数组声明时必须指明大小,数组中元素的个数也是数组类型的一部分,所以大小必须是一个常量表达式。
  2. 数组和vector,其元素必须是对象,所以也不能有引用数组。
  3. 数组类型必须给定,不允许用auto来推断。
  4. 不允许使用数组为其他数组赋值,也不能将一个数组的内容拷贝到另外一个数组。
int a[] = {1,2,3};
int b[] = a; //错误 , 不能用一个数组初始化另外一个数组
b = a; //错误,不能把一个数组直接赋值给另外一个数组

5 . 特殊的字符数组,如果用字面值初始化,会在后面加一个空字符。

char a[] = {'a' , 'b' ,'c'}; //大小为3
char b[] = "abc"; //大小为4,会在末尾加一个空字符

6 . 复杂的数组声明

int *p[10]; //p是一个含有10int指针的数组。
int (*p)[10]; //p是一个指针,指向含有10int的数组的指针。
int (&p)[10]; //p是一个引用,引用的是含有10int的数组。
int *(&p)[10]; //p是一个引用,引用的含有10int指针的数组。

7 . 指针和数组:使用数组的时候编译器默认会把它转为指针。

int a[] = {1,2,3,4,5};
int *p = a; //等价于int *p = &a[0];
++p;  //a[1];
int *p2 = p + 1;  //p2指向a[2];
int *begin = begin(a);  //获取首指针和尾指针
int *end = end(a);

8 . ptrdiff_t, cstddef头文件中定义,指针做运算操作的结果类型。
9 . 当指针执行下标运算的例子:

int a[] = {1,2,3,4,5};
int *p = &a[2];
int j = p[1]; // 相当于*(p+1),就是a[3];

10 . c中的string: c中string是用char[],c中并没有字符串这种类型,只是一种约定俗成的写法,字符串以空字符结束。

char a[] = {'a','b','c'};//a是一个字符数组,但是如果把它当成字符串来用,比如使用strlen函数的时候,就会出错,因为它不是以'\0'结尾的。
char b[] = "abc"; //这样就没问题,编译器会默认加一个

11 . 字符串拼接

//c++中string标准库

string result = str1 + " " + str2;

//c中最好使用strcpy和strcat函数,但是必须先定义好result数组,此时str1和str2都是char[]

char result[100];
strcpy(result , str1);
strcat(result , " ");
strcat(result , str2);

12 . c和c++字符串互相转换

char aaaa[] = {'a' , 'b' ,'c' , '\0'};
    string str(aaaa);
    char bbb[5];
    strcpy(bbb , str.c_str());

13 . 在使用范围内for循环的时候,除了最内层的循环外,其他所有循环控制变量都应该是引用类型。
14 . 在使用多维数组的时候也要注意,也会将其转换为指向首位元素的指针。
15 . tips,使用类型别名命名数组,能让程序更简洁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值