两种最重要的标准库---string和vector
string和vector是两种最重要的标准库类型,string表示可变长的字符序列,vector存放的是某种给定类型对象的可变长序列。
一、标准库类型string
1.定义和初始化string对象:初始化string对象的方式有
string s1 默认初始化,s1是一个空串 string s2(s1) s2是s1的副本
string s2=s1 等价于s2(s1),s2是s1的副本
string s3("value") s3是字面值"value"的副本,除了字面值最后的那个空字符外
string s3="value" 等价于s3("value"),s3是字面值"value"的副本
string s4(n,'c') 把s4初始化为由连续n个字符c组成的串
如果使用等号(=)初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到心创建的对象中去。与之相反,如果
不使用等号,则执行的是直接初始化。
2.string对象上的操作
os<<s 将s写到输出流os当中,返回os is>>s 从is中读取字符串赋给s,字符串以空白分隔,返回is
getline(is,s) 从is中读取一行赋给s,返回is s.empty() s为空返回true,否则返回false
s.size() 返回s中字符的个数 s[n] 返回s中第n个字符的引用,位置n从0计起
s1+s2 返回s1和s2连接后的结果 s1=s2 用s2的副本代替s1中原来的字符
s1==s2 s1!=s2 如果s1和s2中所含的字符完全一样,则他们相等;string对象的相等性判断对字母的大小写敏感
读取未知数量的string对象:
#include <iostream>
#include <string> using namespace std; int main() { string word; while(cin>>word) cout<<word<<endl; return 0; }
使用getline()读取一整行:
getline函数的参数是一个输入流和一个string对象,函数从给定的输入流中读入内容,直到遇到换行符为止(注意换行符也被读进来了),然后把所读的
内容存入到那个string对象中去(注意不存换行符)。
#include <iostream> #include <string> using namespace std; int main() { string line; //每次读入一整行,直到达文件末尾 while(getline(cin,line)) cout<<line<<endl; return 0; }
string的empty和size操作:
empty函数根据string对象是否为空返回一个对应的布尔值,empty也是string的一个成员函数。
#include <iostream> #include <string> using namespace std; int main() { string line; while(getline(cin,line)) //每次读入一整行,遇到空行直接跳过 if(!line.empty()) cout<<line<<endl; return 0; }
size函数返回string对象的长度(即string对象中字符的个数)
#include <iostream> #include <string> using namespace std; int main() { string line; //每次读入一整行,输出其中超过100个字符的行 while(getline(cin,line)) if(line.size()>100) cout<<line<<endl; return 0; }
处理string对象中的字符:使用基于范围的for语句
范围for语句:这种语句遍历给定序列中的每个元素并对序列中的每个值执行某种操作,
for (declaration : expression)
statement
其中,expression部分是一个对象,用于表示一个序列。declaration部分负责定义一个变量,该变量将被用于访问序列中的基础元素。每次迭代,
declaration部分的变量会被初始化为expression的下一个元素值。
#include <iostream> #include <string> #include <ctype.h> using namespace std; int main() { string s("hello world!!!"); for (decltype(s.size()) index = 0;index != s.size() && !isspace(s[index]);++index) s[index] = toupper(s[index]); cout << s << endl; /*decltype(s.size()) punct_cnt = 0; for (auto c : s) if (ispunct(c)) ++punct_cnt; cout << punct_cnt << " punctuation char