命名空间
- 头文件:可将类、全局变量等在头文件中声明,为了防止头文件的重复包含,通常应该使用预处理指令 #define (定义符号)、#ifndef(如果没有定义)、#endif(结束判断)来书写头文件的内容。
字符串
- getline(cin , stringname) :从输入流中读入内容直到读入换行符,保留空白符,但换行符不存入string对象中
- 字面值与string:字符字面值和字符串字面值可以隐式转化为string对象
- empty 函数根据 string 是否为空返回布尔值; size_type 表示各自类型的长度或下标,返回无符号整数,类型为 string::size_type
- 常用函数:islower(c) c是小写字母时为真;isupper(c) c是大写字母时为真 ; tolower(c) c是大写字母时,输出 c 对应的小写字母,否则原样输出 c ;toupper(c) c是小写字母时,输出 c 对应的大写字母,否则原样输出 c ;
向量和数组
- 下标运算符[]:vector或string的下标运算符可用于访问已存在的元素,而不能用于添加元素。添加元素需使用(+= or append or push_back for string) and (insert or push_back for vector)
- 迭代器 end() 指向尾元素的下一位置,不指向具体元素,不能解引用或递增
- 复杂数组声明的理解:从数组名字开始按照由内向外的顺序阅读,如int (&a)[10]表示a是对数组引用,该数组包含10个int
- 数组的缺点:数组的大小是确定不变的,不可以向数组中添加元素,丧失了vectoer的灵活性
- 不可以将整个数组赋值给另一个数组,只能逐个元素的拷贝;可以直接将整个vector拷贝给另一个vector
- 多维数组初始化:使用花括号的形式,未列出的元素执行默认值初始化
- 范围for处理多维数组:除最内层循环外,其他所有循环的控制变量都应该是引用类型,以避免这些数组形式的元素被自动转换成指向数组首元素的指针
- 定义和初始化Vector:
- 默认初始化:vector
v1; - 拷贝初始化:vector
v2=v1; - 直接初始化:vector
v3(v2); - 指定含有多个不相同初始值的初始化:vector
v4{a,b,c,d}; - 指定含有多个相同初始值的初始化:vector
v5(10,-1);
- 默认初始化:vector
- 定义和初始化数组:
- int arr[42] //含有42个整形元素的数组;
- int *arr[10] //含有10个整型指针的数组
- 字符数组也可以使用花括号初始化,但是一定注意后面需要留一个位置给‘\0’
- char a1[]={‘C’,’+’,’+‘,‘\0’};
- char a2[]=”C++”; //a2的维度为4;
- char a3[3]=”C++”;//错误:”C++”,这个字符串是4个元素。
- char a4[]={‘C’,’+’,’+’}; //这种定义是允许的,但是后面会有一系列的问题。
- 不允许将数组的内容拷贝给其他数组作为初始值,也不能用数组为其他数组赋值:
- int a[]={0,1,2};
- int a2[]=a; //错误,不允许将一个数组作为初始值给另外一个数组
- a2=a; //错误,不能把一个数组直接赋值给另外一个数组
- 理解复杂的数组声明
- int *ptrs[10]; //这个数组有10个元素,每个元素都是int指针。
- int &refs[10]; //错误,数组里面应该是对象,不能是引用。(引用不占空间)
- int (*Parray)[10]=&arr; //Parray指向一个含有10个int类型的元素的数组。
- int (&arrRef)[10]=arr; //arrRef引用一个含有10个整型元素的数组。
- int *(&arry)[10]=ptrs;//arry引用一个含有10个指向int类型的指针的数组
- //在编译器上试了一下把括号去掉的效果
- int *&array[10]=ptrs;编译器会报错了,报错内容是不允许定义引用的数组。
- 继续测试: int **array[10];这样的数组初始化必须是{ptr1,ptr2,ptr3…};
- 因此如果对于定义数组,不打括号的话,数组里面的元素应该是数组名字左边的所有声明符加起来。
- 书上说,对于数组的理解应该按照由内到外理解。但是按照之前对指针类型的分析,这里可以这样分析。首先看这个数组里面的元素类型是什么:int *ref[10];
- 可以这样看(int *)ref[10];也就是说这个数组里面的元素都是指针。而
- int (*Parray)[10]=&arr;这种类型,首先数组里面的元素是int型的,再看parray它就是一个指针了。指向这个数组。
字符串操作
assign()//用于赋予新值,assign函数用于将一个字符串的部分内容赋值给另一个string对象
- s2.assign(s1,0,3);//s1 = “hello”,s2的值为“hel”
swap() //交换两个字符串的内容
- swap(s1,s2);//s1=”hello”,s2=”world”,swap函数将s1和s2的内容交换,现在s1=”world”,s2=”hello”
+=、append()、push_back()//在字符串尾部追加内容,”+=”可追加string对象,字符以及C风格字符串,append函数则可以追加string对象和C风格字符串,push_back函数则只能追加字符
- string s1 = “hello”;
- string s2 = “ world”;
- s1 += s2;//正确,s1的值为”hello world“
- s1 +=”world”;// 正确,s1的值为”hello world”
- s1 +=’c’; //正确,s1的值为”helloc”
- s1.append(s2);//正确,s1的值为”hello world”
- s1.append(“ world”);//正确,s1的值为”hello world”
- s1.append(‘c’);//错误,append函数不支持追加字符
- s1.push_back(s2);//错误
- s1.push_back(“world”);//错误
- s1.push_back(‘c’);//正确
insert()//用于插入字符串
- string s1 = “hello”;
- s1.insert(0,”world “);//s1的值为world hello
erase()//用于删除字符的
- string str(“This is an example phrase.”);
- string::iterator it;//迭代器
- str.erase(10,8);//str的值为”This is an phrase.”,删除了从位置10开始的8个字符
- it = str.begin()+9;//迭代器位置为9
- str.erase(it);//删除了从it迭代器位置处的一个字符,str=”This is a phrase.”
- str.erase(str.begin()+5,str.end()-7);//删除两个参数之间的所有字符,str=”This phrase.”
clear()函数和~string()//都是用来删除全部字符的
- str.clear();//删除str的全部字符,此时str为一个空串
- str.~string();//销毁所有字符,释放内存
replace()函数,用于替换字符
- string line = “this@ is@ a test string!”;
- line = line.replace(line.find(“@”),1,””);//将line中从find的@位置开始替换一个长度的字符为”” 结果为this is@ a test string!
==、!=、<、<=、>、>=、compare()//比较字符串
size()函数和length()函数,返回字符串的字符数,从第一个字符到’\0’的长度,\0表示空字符,作为字符串结束符使用,\代表转义字符
empty()//判断字符串是否为空
vector 操作
- insert(p, t) //在迭代器p之前插入t元素
- erase(p) //删除p所指元素
- push_back(t) //向尾部添加t元素
- pop_back() //删除末尾元素
- clear() //清空vector
- size() //返回的是vector的大小
- begin()、end() //返回指向开头与末尾后一位的迭代器
- 指向常量的开始指针: vec.cbegin(); vec.cend(); //意思就是不能通过这个指针来修改所指的内容,但还是可以通过其他方式修改的,而且指针也是可以移动的。
- swap() //交换vector
- 元素的访问:vec.front();vec.back();访问首尾元素
- 有关算法(需要头文件#include
) - reverse(vec.begin(),vec.end()); //将元素翻转,即逆序排列!参数为2个迭代器
- sort(vec.begin(),vec.end()); //(默认是按升序排列,即从小到大).