字符串string
一些初始化string对象的方式:
string str; //str是一个空字符串
string str1(str2); // str1是str2的副本
string str1 = str2; // 等同于str1(str2)
string str("val"); // str是"val"的副本
string str = "val"; //等价于str("val")
string str(n,'a'); //把str初始化为由连续n个字符a组成的串
- 拷贝初始化:用 = 将一个已存在的对象拷贝到正在创建的对象
- 直接初始化:通过()给对象赋值
string的操作:
getline(str1,str2):从str1中读取一行赋给str2,返回str2 ,读取一整行,包括空白符
str.size():返回的是string::size_type类型,是一个无符号类型的值
处理string对象中的字符:
C++版本和C版本头文件的区别:
- C++版本:cctype
- C版本:ctype.h
cctype头文件中定义了一组标准函数:
isalnum(str); //当str是字母或数字时为真
isalpha(str); //当str是字母时为真
iscntrl(str); //当str是控制字符时为真
isdigit(str); //当str是数字时为真
isgraph(str); //当str不是空格但可以打印时为真
islower(str); //当str是小写字母时为真
isupper(str); //当str是大写字母时为真
tolower(str); //当str是大写字母,输出对应的小写字母;否则输出原str
toupper(str); //当str是小写字母,输出对应的大写字母;否则输出原str
- (C++11)范围for:for(auto c : str) 遍历字符串 / for(auto &c : str)使用引用直接 改变字符串中的字符
Vector:
- vector:容器,也是一个类模板
- 头文件 #include<vector> 打开标准命名空间using std::vector;
- 类模板:本身不是类,但可以实例化出一个类。vector是一个模板,vector<int>是一个类型
- 通过将类型放在类模板名称后面的尖括号中来指定类型,如vector<int> vec;
定义和初始化vector:
vector<T> Vec; //Vec是一个空Vector,类型T,执行默认初始化
vector<T> Vec2(Vec1); //Vec2中包含有Vec1所有元素的副本
vector<T> Vec2 = Vec1; //等价 Vec2(Vec1)
vector<T> Vec(n,val); //Vec中包含了n个重复的元素,每个元素的值都是val
vector<T> Vec(n); //Vec中包含了n个重复的执行了值初始化的对象
vector<T> Vec{a,b,c....}; //Vec包含了初始值个数的元素,每个元素被赋予相应的初始值
vector<T> Vec = {a,b,c....}; //等价于Vec{a,b,c....};
C++11 列表初始化:vector<string> v{"abc","def","qwe'};
vector支持的操作:
vec.empty(); //vec为空返回真,否则返回假
vec.size(); //返回vec中元素的个数
vec.push_back(t); //向vec的尾端添加一个值为t的元素
迭代器iterator:
- 所有标准库容器都可以使用迭代器
- 类似于指针类型,迭代器也提供了对对象的间接访问
迭代器的使用:
- vector<int> ::iterator iter
- auto a = v.begin(); 返回指向第一个元素的迭代器
- auto b = v.begin(); 返回指向最后一个元素的下一个的迭代器
- 如果容器为空,begin()和end()返回的是同一个迭代器,都是尾后迭代器
- 使用解引用符*访问迭代器指向的元素
- 容器:可以包含其他对象;但所有的对象必须类型相同
- 迭代器:每种标准容器都有自己的迭代器。C++倾向于用迭代器不是下标遍历元素
- const_iterator:只能读取容器内元素,不可改变
- 箭头运算符:item -> val 等价于 (*item).val
标准容器迭代器的运算符:
*iter; //返回迭代器iter所指向的元素的引用
iter->val; //等价于(*iter).val
++iter; //iter指向容器中的下一个元素
--iter; //iter指向容器中的上一个元素
iter1 == iter2; //判断两个迭代器是否相等
数组:与vector不同之处--数组长度固定
定义和初始化内置数组:
- 初始化:char arr[buffer_size]; 长度必须是conse表达式,或者不写,让编译器自己推断
- 数组不允许直接赋值给另一个数组
访问数组元素:
- 数组下标类型:size_t
- 字符数组:结尾处有一个空字符'\0'
- 用数组初始化vector; int arr[] = {1,2,3,4,5}; vector<int> vec(begin(arr),end(arr));
指针访问数组:在表达式中使用数组名时,名字会自动转换成指向数组的第一个元素的指针
C标准库String函数,定义在<cstring>中:
strlen(str); //返回str的长度,空字符'\0'不计算在内
strcmp(str1,str2); //比较str1和str2。如果str1 == str2,返回0
str1 > str2,返回正数
str1 < str2,返回负数
strcat(str1,str2); //将str2附加到str1之后,返回str1
strcpy(str1,str2); //将str2拷贝给str1,返回str1
指向指针的指针
- 定义: int **p = &p1;
- 解引用:**p;
动态数组
- 使用new和delete在堆区中分配存储空间
- 定义:int *p = new int[3];
- 释放:delete[] p ,不要忘记[]