第二章:字符串、向量和数组

字符串、向量和数组


命名空间的using声明

略过…


标准库类型string

标准库类型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)

string上的操作

常见操作 说明
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();

处理string对象中的字符

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<<c<<endl;
}

转换成大写形式
for(auto &c: str){
c = toupper(c);
}

下标迭代
for(decltype(str.size()) index =0;index!=str.size()++index){
cout<<str[index] <<endl;
}


//迭代器


标准库类型vector

标准库类型vector表示对象的集合,在其中所有对象的类型都相同。因为vector容纳其它对象,所以它也常被称作容器。

定义初始化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};
vector<T> 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<<endl;
}

迭代器类型

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<<endl;
}

指针和数组

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<<*b<endl;
}

计算得到尾后指针,极易出错。标准库提供了函数begin和end
int ia[] ={1,2,3,4};
int *beg =begin(ia);/指向ia首元素的指针
int *last =end(ia);//指向ia尾后元素指针


vector 和string 迭代器支持的运算,数组的迭代器也支持

猜你喜欢

转载自blog.csdn.net/chinaaaaaaaaaaa/article/details/82083207