字符串、向量和数组
标准库类型string
定义和初始化string对象
string s1;
//默认初始化,s1是一个空串
string s2(s1);
string s2 = s1;
//s2是s1的副本
string s3("value");
string s3="value";
string s4(n,'c');
//把s4初始化为由连续n个字符c组成的串
直接初始化与拷贝初始化
使用**=**:拷贝初始化,编译器将等号右侧的初始值拷贝到新创建的对象中 其余为直接初始化
string对象上的操作
os<<s;
//将s写到输出流中,返回os
is>>s;
//从is中读取字符串赋给s,字符串以空白分隔,返回is
getline(is,s);
//从is中读取一行赋给s,返回is,会读入换行符
s.empty();
//s为空返回true,否则返回false
s.size();
//返回s中字符的个数
//返回string::size_type类型的值,无符号类型
s[n];
//返回s中第n个字符的引用,位置n从0计起
s1+s2;
//返回s1和s2连接后代结果
//当把string对象和字符字面值以及字符串字面值混在一条语句中使用时,必须确保每个加法运算符的两侧的运算对象至少由一个是string
string s4=s1+",";
//string s5="hello"+".";//均不是string
string s6 = s1+"."+"world";
//string s7="hello"+","+s2;
s1==s2;
s1!=s2;
<,<=,>,>=
处理string对象中的字符
cctype 头文件中定义了一组标准库处理string对象中的字符
isalnum(c);
//当c是字母或数字时为真
isalpha(c);
//当c时字母时为真
iscntrl(c);
//当c时控制字符时为真
isdigit(c);
//当c时数字时为真
isgraph(c);
//当c不是空格但可打印时为真
islower(c);
//当c时小写字母时为真
isprint(c);
//当c是可打印字符时为真(即c时空格或c具有可视形式)
ispunct(c);
//当c时标点符号时为真(即c不是控制字符、数字、字母、可打印空白中的一中)
isspace(c);
//当c时空白时为真(即c时空格、横向制表符、纵向制表符、回车符、换行符、进纸符中的一种)
isupper(c);
//当c时大写字母时为真
isxdigit(c);
//当c时十六进制数字时为真
tolower(c);
//如果c是大写字母,输出对应的小写字母,否则原样输出
toupper(c);
//如果c是小写字母,输出对应的大写字母,否则原样输出
标准库类型vector(容器)
表示对象 的集合,其中所有对象的类型均相同(引用不可) vector 头文件为类模板
定义和初始化vector对象
vector<T>v1;
//v1是一个空vector,其潜在的元素是T类型,执行默认初始化
vector<T>v2(v1);
vector<T>v2=v1;
//v2中包含所有v1元素的副本
vector<T>v3(n,val);
//v3包含了n个重复元素,每个元素都是val
vector<T>v4(n);
//v4包含了n个重复执行了值初始化的对象
vector<T>v5{a,b,c...};
vector<T>v5={a,b,c...};
//v5包含了初始值个数的元素,每个元素都被赋予相应的初始值
列表初始化vector对象
vector<string>srtices={"a","an","the"};
//vector<string>srtices=("a","an","the");
创建指定数量的元素
vector<int>ivec(10,-1);
//10个int类型的元素,每个都被初始化为-1
vector<int>v1(10);
//含由10个元素,每个元素的值都是0
vector<int>v2{10};
//含有一个元素,该元素的值为10
vector<int>v3(10,1);
//含有10个元素,每个元素的值都是1
vetcor<int>v4{10,1};
//含有两个元素,值为10,1
vector<string>v5{"hi"};
//列表初始化,v5有一个元素,为hi
//vector<string>v5("hi");不能使用字符串字面值构建vector对象
vector<string>v7{10};
//v7有10个默认初始化的元素
vector<string>v8{10,"hi"};
//v8有10个值为"hi"的元素
向vector对象中添加元素
string word;
vector<string>text;
while(cin>>word){
text.push_back(word);
}
如果循环体内部包含有向vector对象添加元素的语句,则不能使用for循环 for循环语句体内不应改变其所遍历序列的大小
其他vector操作
v.empty();
//如果v不包含有任何元素,返回真,否则返回假
v.size();
//返回v元素的个数
v.push_back(t);
//向v的尾端添加一个值为t的元素
v[n];
//返回v中第n个位置上元素的引用
//不能使用下标形式添加元素
//因为索引时不存在该元素
v1=v2;
//用v2中元素的拷贝替换v1中的元素
v1={a,b,c...};
v1==v2;
v1!=v2;
<,<=,>,>=
迭代器
所有标准库容器都可以使用迭代器,但是其中只有少数集中才同时支持下标运算符 string对象不属于容器类型,但是string支持许多与容器类型类似的操作
使用迭代器
begin 成员负责返回指向第一个元素(或第一个字符)的迭代器end 成员赋值返回指向容器(或string对象)尾元素的下一位置的迭代器(尾后迭代器)
auto b = v.begin(),e = v.end();
//由编译器觉得b和e的类型
//一般不清楚也不在意迭代器的准确类型
//容器为空
b==e;
迭代器运算符
*iter;
//返回迭代器iter所指元素的引用
iter->mem;
(*iter).men;
//解引用iter并获取该元素的名为mem的成员
++iter;
//令iter指示容器中的下一个元素
--iter;
//令iter指示容器中的上一个元素
iter1==iter2;
iter1!=iter2;
迭代器类型
拥有迭代器的标准库类型使用iterator 与const_iterator 来表示迭代器的类型
vetcor<int>::iterator it;
//it能够读写vector<int>的元素
string::iterator it2;
//it2能够读写string对象中字符
vector<int>::const_iterator it3;
//it3只能读元素,不能写元素
string::const_iterator it4;
//it4只能读字符,不能写字符
某些对vector对象的操作会使迭代器失效
任何一种可能改变vector对象容量的操作都会使该vector对象的迭代器失效
迭代器运算
iter + n;
//迭代器加上一个整数值扔得一个迭代器,迭代器指示的新位置与原来相比向前移动了若干个元素,结果迭代器或指示容器内的一个元素,或至少容器尾元素的下一个位置
iter - n;
//迭代器减去一个整数值扔得一个迭代器,迭代器指示的新位置与原来相比向后移动了若干个元素,结果迭代器或指示容器内的一个元素,或至少容器尾元素的下一个位置
iter1 += n;
iter1 -= n;
iter1 - iter2;
//两个迭代器相减的结果是它们之间的距离,即将运算符右侧的迭代器向前移动差值个元素后将得到左侧的迭代器,参与运算的两个迭代器必须指向的是同一个容器中的元素或尾元素的下一位置
>,>=,<,<=;
//迭代器的位置比较
数组
定义和初始化内置数组
不允许使用auto关键字由初始值的列表推导类型 数组的元素应为对象,不存在引用的数组 不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其他数组赋值
int *ptrs[10];
//ptrs是含有10个整型指针的数组
//int &refs[10];
//不存在引用的数组
int (*Parray)[10]=&arr;
//Parray指向一个含有10个整数的数组
int (&arrRef)[10]=arr;
//arrRef引用一个含有10个整数的数组
int *(&arry)[10]=ptrs;
//arry是数组的引用,该数组含有10个指针
C风格字符串
C标准库string函数
strlen(p);
//返回p的长度,空字符不计算在内
strcmp(p1,p2);
//比较p1和p2的相等性,若p1==p2返回0,p1>p2返回一个正值,p1<p2返回一个负值
strcat(p1,p2);
//将p2附加到p1之后,返回p1
strcpy(p1,p2);
//将p2拷贝给p1,返回p1