C++PRIMER第一轮复习第三章

C++除了内置类型外,还定义了丰富的抽象数据类型库,其中,string与vector是非常重要的标准库类型。前者支持可变长字符串,后者表示可变长集合。还有标准库类型是迭代器,是string与vector配套类型。

3.1

using声明

using namespace std; 
using std::cin;
头文件不应包含using声明

3.2

使用string类型必须包含string头文件,string定义在命令空间std中。

#include<string>
using std::string;
初始化string对象的方式
string s1;//默认初始化
string s2(s1);//s2是s1的副本
string s3("value");//s3是字面值"value"的副本, 除了字面值最后的空字符。
string s3="value";//等价于s3("value")
string s4(n,'c'); //把s4初始化为由连续n个字符c组成的字符串
直接初始化与拷贝初始化,用=执行的是拷贝初始化,不用等号,执行的是直接初始化。

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;//判断是否完全一样, 大小写敏感
<, <=, >, >= ;//字典序中的顺序比较,大小写敏感
getline读取一整行,换行符也被读进去,但是不把它存入string对象中去。string类与其他大多数类都定义了几种配套的类型,这些配套类型体现了标准库类型与机器无关的特性,类型size_type也是其中的一种,size函数返回的是string::size_type类型, 它是一种无符号类型的值,且能够放下足够大的string对象的大小。C++11标准中允许编译器通过auto推断变量类型:
auto len=line.size();//len的类型是string::size_type
string对象允许把一个对象的值赋值给另一个对象。 string对象可以相加,字面值与string对象也可以相加,但是字面值与字面值不能相加。
string s6=(s1+", ")+"world";//正确
注意字面值字符串与string对象是不同的类型。

处理string对象的字符,cctype头文件中定义了标准库函数:

isalnum(c) //当c是字母或数字时为真
isalpha(c)  //当c是字母为真
iscntrl(c)   //当c是控制字符为真
isdigit(c)   //当c是数字为真
isgraph(c) //当c不是空格但可打印时为真
islower(c)  //当c是小写字母时为真
isprint(c)   //当c是可打印字符为真(即使c是空格或c具有可视形式)
ispunct(c) //当c是标点符号为真
isspace(c) //当c是空白为真
isupper(c)  //当c是小写字母为真
isxdigit(c)  //当c是十六进制数字为真
tolower(c)  //如果c是大小字母,输出小写
toupper(c)  //如果c是小写字母,输出大写
C++标准库兼容了C语言的标准库,C的头文件形如name.h, C++则将这些文件命名为cname,去掉了.h后缀,而在name前加上字母c,在cname的头文件定义的名字从属于命名空间std。C++标准并不要求标准库检查下标是否合法,所以要注意检查下标的合法性。

3.3

vector表示对象的集合,常常被称作是容器。vector能容纳绝大多数类型的对象作为元素,但是因为引用不是对象,所以不存在引用的vector。早期如果vector的元素还是vector,必须写成vector<vector<int> >(有空格)。现在C++11标准允许携程vector<vector<int>>(无空格)。

定义与初始化vector对象:

vector<T> v1    //v1是个空vector,它潜在元素是T类型的,执行默认初始化
vector<T> v2(v1)//v2包含有v1所有元素的副本
voctor<T> v2=v1 //等价于v2(v1)
vector<T> v3(n,val) //v3包含了n个重复val的元素
vector<T> v4(n)    //v4包含了n个值初始化的对象
vector<T> v5{a,b,c...}//v5包含了初始值个数的元素
vector<T> v5={a,b,c...}//等价于v5{a,b,c...}
也可以把一个vector对象元素拷贝给另外一个vector对象
vector<int> ivec;
//加内容
vector<int> ivec2(ivec);
拷贝初始化只能提供一个初始值,提供类内初始值只能用拷贝初始化或花括号形式初始化,提供初始值列表,只能把初始值放在花括号里列表初始化。下面几种初始化
vector<int> v1(10);
vector<int> v2{10};
vector<int > v3(10,1);
vector<int> v4{10,2};
vector<string> v5{"hi"};
vector<string> v6("hi");//错误
vector<string> v7{10};//v7有10个默认初始化的元素
向vector中添加元素类型push_back(), vector对象能高效的增长。开始先创建空的vector对象,在运行时在动态的添加元素。几种vector操作
v.empty() //若v不含任何元素返回真
v.size() //返回v中元素的个数
v.push_back(t) //向v的尾端添加一个值为t的元素
v[n] //返回v中第n个位置上元素的引用
v1=v2 //拷贝替换
v1={a,b,c...}//列表元素拷贝替换
v1==v2;v1!=v2//判断等性
<, <=, >, >=//字典序比较
size()返回值类型由vector定义的。如vector<int>::size_type。不能用下标形式添加元素,应该使用push_back。只能对确知已存在的元素执行下标操作。不然会导致缓冲区溢出。

3.4

可以通过下标运算符来访问string对象的字符或vector对象的元素,还有一种机制也可以。就是迭代器。除了vector之外,还有几种容器,容器都可以使用迭代器。迭代器提供了对对象的间接访问。就迭代器而言,其对象是容器中的元素或者string对象中的字符。有迭代器的类型同时拥有返回迭代器的成员,比如这些类型都拥有begin与end成员。

auto b=v.begin(), e=v.end();
end成员返回尾后迭代器,指向尾元素的下一个位置。迭代器支持的一些运算:
*iter
iter->men//等价于(*iter).men
++iter
--iter
iter1==iter2
iter1!=iter2
for(auto it=s.begin();it!=s.end()&&!isspace(*it);++it)
	*it=toupper(*it);
 泛型编程,C++程序员习惯使用!=因为所有标准库容器都定义了==与!=, 但又大多数没有定义<运算符。所以尽量使用!=吧!
vector<int>::iterator it;//it能读写vector<int>元素
vector<int>::const_iterator it2;//只能读,不能写
(*it).empty()//前面需要加(),
C++11引入了两个函数,cebegin与cend, 返回类型是const_iterator。

不能再范围for循环中向vector添加元素,push_back会导致vector对象的迭代器失效。只要使用了迭代器的循环体,都不要想迭代器所属容器添加元素。迭代器的一些运算:

iter +n
iter -n
iter+=n
iter1-iter2
迭代器距离的类型名是difference_type,其可正可负,是带符号类型。

3.5

数组的维度是个常量表达式(编译过程中就能得到计算结果的表达式)。默认情况下,数组元素会被默认初始化。数组不允许拷贝与赋值。有一些复杂的数组声明:

int *ptrs[10];//含有10个整型指针的数组
int &refs[10]=/*?*/;//错,不存在引用的数组
int (*parray)[10]=&arr;//指向含有10个整数的数组
int(&arrref)[10]=arr;//引用含有10个整数的数组
int *(&arr)[10]=ptrs;//数组的引用。数组含有10个指针

数组的下标定义为size_t类型,它是一种与机器相关的无符号类型,在头文件cstddef中定义了size_t类型。数组下标是否在合理范围之内要由程序员检查。

标准库函数begin与end。C++11为了让指针的使用更简单、安全,引入了begin与end函数。将数组作为他们的参数

int *beg=begin(ia);
尾后指针不能执行解引用与递增操作。两个指针相减的结果是他们的距离,他们的类型为ptrdiff_t标准库类型,与size_t一样,ptrdiff_t也是地ing一在cstddef中的。

虽然标准库类型string与vector也能执行下标运算,但是数组与他们还有些不同,标准库类型限定使用的下标必须是无符号型,而内置的下标运算无此要求。内置的下标运算可以处理负值。

C风格字符串以空字符结束。cstring:

strlen(p) //返回p的长度,空字符不算
strcmp(p1,p2) //比较p1与p2相等性
strcat(p1,p2)//将p2附加到p1后,返回p1
strcpy(p1,p2)//将p2拷贝给p1.
对大多数应用来说,使用标准库string要比使用C风格字符串更安全、高效。

可以用数组初始化vector对象:
vector<int> ivec(begin(int_arr),end(int_arr));//int_arr是数组

建议:尽量使用vector与迭代器,避免使用内置数组与指针。尽量使用string,避免使用C风格字符串。

3.6

多维数组,看懂这个例子:

using int_array=int[4];
typedef int int_array[4];
for(int_array *p=ia;p!=ia+3;++p){//p指向函数4个整数的数组
	for(int *q=*p;q!=*p+4;++q)
		cout<<*q<<' ';
	cout<<endl;}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值