//这就是错误的,都是字面值
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<int> v1{10}; //10个int,每个都为0
vector 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::iterator
auto it2 = v.end(); //it2的类型是:vector::const_iterator
//如果对象只需要读而无需写的话,用const_iterator比较好,所以c++提供了cbegin()和cend(),无论vector对象是否是常量,都返回const_iterator
8 . 箭头运算符 -> ,就是把解引用和成员访问结合在一起了。
(*it).empty(); //it是一个迭代器,两行代码效果一样
it.empty();
9 . difference_type: 两个迭代器之间的距离。
iterator可以进行算术运算,所得到的的结果类型为difference_type
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是一个含有10个int指针的数组。
int (*p)[10]; //p是一个指针,指向含有10个int的数组的指针。
int (&p)[10]; //p是一个引用,引用的是含有10个int的数组。
int *(&p)[10]; //p是一个引用,引用的含有10个int指针的数组。
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,使用类型别名命名数组,能让程序更简洁。