第三章 字符串、向量和数组学习笔记(第一遍阅读)
string和vector是两种最重要的标准库类型。string对象是一个可变长的字符序列,vector对象是一组同类型对象的容器。
迭代器允许对容器中的对象进行间接访问。
数组和指向数组元素的指针在一个较低的层次上实现了与标准库类型string和vecotr类似的功能。
一般来说,应该优先选用标准库提供的类型。
标准库类型String
标准库类型string表示可变长的字符序列,使用string类型必须包含string头文件。
#include<string>
using std::string;
定义和初始化string对象
初始化string对象的方式:
string s1;% 默认初始化,s1是一个空串
string s2(s1);%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,字符串以空白分隔
getline(is,s)% 从is中读取一整行赋给s
使用IO操作符可以读写string对象。
出发getline函数返回的那个换行负实际上被丢弃了,得到的string对象中并不包含换行符。
int main()
{
string line;
%每次读取一整行,直到文件末尾
while(getline(cin,line))
cout<<line<<endl;
return 0;
}
其他操作
s.empty() %s为空返回true非空返回false
s.size() %返回s中字符个数,size函数返回的是一个size_type类型的值。auto len=line.size();
s[n] %返回s中第n个字符的引用,位置n从0计数
s1+s2 %返回s1和s2连接后的结果
s1=s2 %用s2的副本代替s1中原来的字符
%依照大小写敏感的字典顺序
s1==s2 %检验两个字符串是否相等
s1!=s2 %检验两个字符串是否不等
<,<=,>,>= %字符串比较
处理string对象中的字符
1.使用基于范围的for语句处理每一个字符。
2.使用下标执行随机访问,只处理一部分字符。
在cctype头文件中定义了一组标准库函数可以改变单个字符的特性page82。
标准库类型vector
标准库类型vector是对象的集合,也被称作容器。vector是模板而非类型,由vector生成的类型必须包含vector中元素的类型,例如vector< int >
定义和初始化vector对象
vector<T> v1 %默认初始化
vector<T> v2(v1) %直接初始化
vector<T> v2=v1 %拷贝初始化
vector<T> v3(n,val)
vector<T> v4(n)
vector<T> v5{a,b,c,d...} %列表初始化
vector<T> v6={a,b,c,d,e...}
向vector对象中添加元素
使用push_back函数可以将vector中添加元素,push_back负责把一个值当做一个vector对象的尾元素压到vector对象的尾端。
vector<int> v1;
for(int i=0;i!=100,++i)
v1.push_back(i);
其他操作
vector也能使用for循环遍历;
vector也提供了和string类似的操作;
只能用下标操作符访问vector中已经存在的元素,不能使用下标形式添加元素,需要添加元素等则使用push_back();
迭代器
类似指针,迭代器也提供了对对象的间接访问,使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另一个元素。
和指针不一样的是,获取迭代器不使用取地址符,有迭代器的类型同事拥有返回迭代器的成员。
迭代器运算符
*iter %返回iter所指元素的引用
iter->mem %解引用iter并获取钙元素的名为mem的成员
++iter %令iter指示容器中的下一个元素
__iter %令iter指示容器中的上一个元素
iter1==iter2 %
iter1!=iter2 %
迭代器运算:
迭代器之间可以进行加减运算
迭代器相减可得到两个元素之间的距离
迭代器也可以使用递增递减操作符移动一个元素之间的距离
数组
数组的大小确定不变,不能随意向数组中怎家元素,如果不清楚元素的确切个数,使用vector。
定义数组的时候必须指定数组的类型,不允许使用auto关键字来推断数组类型。
数组不允许拷贝和赋值。
int p[10];%默认初始化
const usigned sz=3;% 显式初始化
int ial[sz]={0,1,2};
char a1[]={'a','b','c'}; %列表初始化
char a2[]="c++";
访问数组元素可以使用范围for语句和下标运算符,数组的索引从0开始。
数组和指针
使用数组类型的对象其实是使用一个指向该数组首元素的指针。
string nums[]={"one","two","three"};
string *p=&nums[o];
string *p1=nums; %等价于 *p1=&nums[o]
vector和string的迭代器支持的运算,数组的指针全部支持。
多维数组
通常所说的多维数组其实是数组的数组。
int ia[3][4]={
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
}
for(auto p=begin(ia);p!=end(ia);++p){
for(auto q=begin(*p);q!=end(*p);++q)
cout<<*q<<' ';
cout<<endl;
}