略过…
标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件。
定义和初始化string对象
string s0; 默认初始化,s0是一个空串
string s1(s0); s1是s0的副本
string s2 = s1;
string s3("value");
string s5(10,'c'); 10个c
如果使用等号(=)初始化一个变量,实际上执行的拷贝初始化(copy initializantion),编译器把等号右侧的初始化值拷贝到最创建的对象中,与之相反,如果不使用等号,则执行的是直接初始化(direct initialization)。
常见操作 | 说明 |
---|---|
os<< s | 将s写到输出流os中,返回os |
is>>s | 从is中读取字符串赋给s,字符串以空白分隔 |
getline(is,s) | 从is中读取一行赋给s,返回is |
s.empty() | ture s为空 |
s.size() | 返回s中的字符个数 |
s1+s1 | 相加,必须一方是string 对象 |
s1==s2 | 判断的是值 |
string::size_type类型
string::size_type是size()函数返回的类型,string类及其它大多数标准库类型都定义了几种配套的类型,这些配套类型体现了标准库类型与机器无关的特性,类型size_type 即是其中一的一种。在具体使用的时候,通过作用域操作符来表明名字string_type是在string中的定义的。
string s("value");
string::size_type i =s.size();
auto i2 = s.size();
cctype中文件中的函数 | |
---|---|
isalnum(c) | 当c是字母或数字时为true |
isalpha(c) | 当c是字母时为true |
iscntrl(c) | 当c是控制字符时为true |
isdigit(c) | 当c是数字时true |
isgraph(c) | 当c不是空格但可印为true |
islower(c) | 当c是小写字母为true |
isprint(c) | 当c是可打印字符为true |
isspace(c) | 空白时为true |
isupper(c) | 是大写字母为true |
isxdigit(c) 是十六进制数字为true | |
tolower(c) | 如果c是大写字母,输出对应的小写字母,否则原样输出c |
toupper(c) | 如果c是小写字母,输出对应的大写字母,否则原样输出c |
输出str中的一个字符
string str("hello world");
for(auto c : str){
cout<for(auto &c: str){
c = toupper(c);
}
下标迭代
for(decltype(str.size()) index =0;index!=str.size()++index){
cout<<str[index] <//迭代器
标准库类型vector表示对象的集合,在其中所有对象的类型都相同。因为vector容纳其它对象,所以它也常被称作容器。
vector v1;
vector v2(v1);
vector v2 = v1;
vector v3(n,val);
vector v4(n);
vector v5{a,b,c};
vector v6={a,b,c};
//操作
v.push_back(t); 向v的尾端添加一个值为t的元素
...其它和string类似
vector<string> v{"a","b"};
end返回尾元素的下一个元素,被称作尾后迭代器
auto beg = v.begin(),end =v.end();
for(auto it = v.begin();it!=v.end();++it){
cout<< *it<
迭代器类型
it能读写
vector<int>::iterator it;
it2能读写
string::iterator it2;
it3只有读
vecotr<int>::const_iterator it3;
it4只有读
string::const_iterator it4;
const vector<string> v;
返回string::const_iterator
auto beg = v.begin();
c++新标准加入的两个新函数,返回string::const_iterator
auto beg2 =v.cbegin();
auto beg3 =v.cend();
数组是一种类似于标准库类型vector的数据结构,但是在性能和灵活性的权衡上又与vector有所不同,与vector相似的地方是,数组也存放类型相同的对象的容器。与vector不同的对象是,数组的大小确定不变,不能随意向数组中增加元素。因为数组的大小固定,因此对某些特殊的应用来说程序的运行时性能较好,但是相应地也损失了一些灵活性。
含有10个整数的数组
int arr[10];
含有10个整形指针的数组
int *parr[10]
int arr2[] ={0,1,2};
int &ref[10] =... 错误,不存在引用的数组
parray指向一个含有10个整数的数组
int (*parray)[10]=&arr2;
arrRef引用一个含有10个整数的数组
int (&arrRef)[10] = arr;
字符数组的特殊性
char a3[]="c++"; 自动添加表示字符串结束的空字符
不允许拷贝和赋值。
int a[] ={0,1,2};
int a2[] = a; 错误
a2 = a; 错误
访问数组元素
unsigned scores[11] ={};
for(auto i: scores){
cout<< i<
string nums[] ={"one","two","three"};
string *p0 =&nums[0];
string *p1 = nums; p1与p0等价
int ia[] ={1,2,3,4};
auto ia2(ia); ia2是一个整形指针,指向ia的第一个元素
ia2 =42 错误,ia2是一个指针
例外情况:
decltype(ia) ia3 ={1,2,3,4}; ia3是一个含有4个整数的数组,并不是指针
指针也是迭代器
int arr[] ={1,2,3,4,5};
int *e =&arr[4];
for(int *b = arr;b!=e;++b){
cout<<*bint ia[] ={1,2,3,4};
int *beg =begin(ia);/指向ia首元素的指针
int *last =end(ia);//指向ia尾后元素指针
vector 和string 迭代器支持的运算,数组的迭代器也支持