相等性运算符== !=字符串长度所包含字符全部同
关系性运算
< <= > >=
把string对象和字符字面值及字符字面值混合在一条语句中使用,须确保每个加法运算符(+)的两侧的运算对象至少有一个是string 不能把字面值直接相加 编译器无法做到两个字面值的直接相加运算 C++中字符串字面值并不是标准库类型string对象,字符串字面值与string是不同类型 #include <iostream> using namespace std; //行读取 int main(int argc,const char *argv[]) { string line; while(getline(cin,line)) { cout << line << endl; } } //单词 int main() { string word; while(cin >> word) { cout << word << endl; } } //输出string.size > 20 的行 int main() { string line; while(getline(cin,line)) { if(line.size() > 20) { cout << line << endl; } } } //pass输入的空行 int main() { string line; while(getline(cin,line)) { if(!line.empty()) { cout << line << endl; } } }
string类的输入运算符>> 输出运算符 处理string对象中字符 检查string对象是否包含Space,string对象中字母改成小写,查看特定字符是否出现 cctype头文件中,定义了一组标准函数 isalnum(c) litter number alphanumric 字母数字True isalphanumeric isalnum isalpha(c) 参数 iscntrl()控制字符 isdigit(c) 数字 isgraph() #include <iostream> using namespace std; int main(int argc,const char *argv[]) { char c; //Prompt Input# cout << "[Prompt input#] "; while(cin >> c) { if(isupper(c)) { cout << "upper char c = " << c << endl; cout << "convert isupper to is lower: " <<char( tolower(c)) << endl; } else { cout << "lower char c = " << c << endl; cout << "convert to is upper: " << char(toupper(c)) << endl; } } }
处理string对象每个字符,使用基于范围的for for(range for); 遍历给定序列的每个元素并对序列每个值执行操作 for(declaration:expression) statement; 基于范围的for 对string对象每个字符操作 语句遍历给定序列每个元素并对序列每个值执行操作 for(declaration:expression) expression对象表示序列 declaration部分负责定义变量 declaration部分负责定义变量 变量被用于访问序列中基础元素,每次迭代,declaration部分变量被初始化w欸expression部分的下一个元素 string对象表示字符序列,string对象作为范围for语句expression 可以使用范围for语句把string对象字符每行一个输出
declaration部分负责定义一个变量,变量用于访问序列基础元素 每次迭代 declaration部分的变量会被初始化为expression部分的下一个元素 使用范围for语句改变字符串中的字符 改变string对象中字符,把循环变量定义成引用 所谓引用只是给定对象的一个别名 使用引用作为循环控制变量 ,变量实际被依次绑定到序列的每个元素,使用引用即能改变绑定字符 访问string对象中单个字符 使用下标迭代器 下标运算符[] 接收的参数string::size_type类型的值 参数表示要访问的字符位置 String对象的下标 >= 0 <string.size() 使用下标访问空String引发问题 while(!string.empty()) { cout << string[0] << endl; } 在访问指定字符之前,检查s是否为空 只要对string对象使用下标 都有确认那个位置上确实有值 只要字符串不是常量,就能为下标运算符返回的字符赋值 string s("some string") if (!s.empty()) //确保string { s[0] = toupper(s[0]);为s的第一个字符赋值 }
提供的是初始化元素值的列表,只能把初始值都放在花括号进行列表初始化,不能放在圆括号 创建指定数量的元素 用vector对象容纳的元素数量和所有元素的统一初始值来初始化vector对象 用vector对象容纳的元素数量和所有元素的统一初始值来初始化vector对象 vector<int> ivec(10,-1);个数 value vector<> intVector(count,RealValue); vector<string> stringVector(10,"hi!"); 值初始化 只提供vector对象容纳的元素数量而不用初始值,库会创建初始化值初始值由vector对象中元素的类型决定; vector<int> ivec(10); //10个元素,每个都初始化为0 vector<string> svec(10); //10个元素 每个都是空string对象; 初始值,元素数量 用一个整数来初始化vector<int>,整数的函数可能是vector对象的容量 列表初始值还是元素数量 vector<int> v1(10); //v1有10个元素,每个的值都是0 vector<int> v2{10}; //v2有1个元素,元素的值是10; vector<int> v3(10,1); //v3有10个元素,每个元素值都是1 vector<int> v4{10,1}; //v4有2个元素,值分别是10和1; 如果用的是圆括号,可以说提供的值是用来构造(construct)vector对象,元素的值可有可无;说明了vector对象的容量 对象容量和元素的初始值 元素的类型一定一样,多个vector的元素的值可以一样,也可能不一样 值得注意: vector对象有size方法,用于获取对象的元素个数 vector对象的每个元素 都有一个索引,所以用于获取对于对象的值; vector<int> v1(10); //cout << v1.size() << endl; for(int i = 0;i < v1.size();i++) { std::cout <<v1[i] << std::endl; }
初始化使用花括号-在string是值,列表初始化一个含有string对象的vector 应该提供能赋予给String对象的初始值,此时不难区分到底是要列表初始化vector对象的元素还是用给定的容量值来构造vector对象; vector<string> v5{"h1"}; //列表初始化,v5有一个元素,值为 vector<string> v6("hi") 不能使用字符串字面值构建vector对象; vector<string> v7{10}; 花括号里面的值需要元素类型一致 不能用int初始化string对象 v7 v8提供的值不能作为元素的初始化值确认无法执行列表初始化后,编译器会尝试用默认值初始化vector; 需要注意两点 初始化元素值 一定用{}或是用()构造 初始化值类型一定要与元素类型一致; 向vector对象中添加元素 对vector对象 直接初始化适用于 初始值已知且数量较少 初始值是另外一个 向vector对象中添加元素 好的处理方法先创建空vector,在运行时利用vector成员函数push_back向其中添加元素 push_back负责把一个值当成vector对象的尾元素压到pushvector对象的尾端(back)
控制变量定义成引用类型 string *p2 = &nums[0]; p2 = &nums[0]; p2存储的是对象的地址,*p2 是解除引用,获取对象的值; 大多数表达式,使用数组类型的对象其实是使用一个指向该数组首元素的指针 一些情况下数组的操作实际是指针的操作 首先定义了两个名为pbeg和pend的整数据 constexpr size_t sz = 5; int arr[sz] = {1,2,3}; int *ip = arr &arr[0] int *ip2 = ip + 4; 传入此类函数的指针必须指向以空字符作为结束的数组 传入此类函数的指针必须指向以空字符作为结束的数组 char ca[] = {'c','+','+'}; //不以空字符结束