C++学习(二)

第三章

using声明
●使用某个命名空间:例如 using std::cin表示使用命名空间std中的名字cin。
头文件中不应该包含using声明。这样使用了该头文件的源码也会使用这个声明,会带来风险。

标准库类型string
标准库类型string表示可变长的字符序列。
需包含#include ,然后 using std::string;
string对象:注意,不同于字符串字面值。

定义和初始化string对象
拷贝初始化(copy initialization):使用等号=将一个已有的对象拷贝到正在创建的对象。
直接初始化(direct initialization):通过括号给对象赋值。

方式解释
string s1默认初始化,s1是个空字符串
string s2(s1)s2是s1的副本
string s2=s1等价s2(s1)
string s3(“value”)s3是字面值“value”的副本,除了字面值最后的那个空字符外
string s3=“value”等价于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中所含的字符完全一样,则它们相等;string对象的相等性判断对字母的大小写敏感
s1!=s2同上
<, <=, >, >=利用字符在字典中的顺序进行比较,且对字母的大小写敏感

读写string对象
string io:
执行读操作>>:忽略掉开头的空白(包括空格、换行符和制表符),直到遇到下一处空白为止。
getline:读取一整行,包括空白符。
为了与C兼容,字符串字面值和string是不同的类型。

处理string对象中的字符
ctype.h vs cctype:C++修改了c的标准库,名称为去掉.h,前面加c表示属于C的标准库。
cctype中定义了许多标准函数 类似:
isalpha© 当c为字母为真
isdigit© 当c为数字时为真
toupper© 如果是小写输出大写字母
ispunct© 如果是标点符号为真

遍历字符串:使用范围for(range for)语句: for (auto c: str),或者 for (auto &c: str)使用引用直接改变字符串中的字符。 (C++11)
使用下标[ ] 需检查字符是否为空 否则返回的值将会是未定义的,同时利用decltype(s.size() ) index=0;可以防止下标小于0,超出范围的下标会引发未知结果。

标准库类型vector
vector是一个容器,也是一个类模板;
#include 然后 using std::vector;
容器:包含其他对象,不能包含引用
类模板:本身不是类,但可以实例化instantiation出一个类。 vector是一个模板, vector是一个类型。
通过将类型放在类模板名称后面的尖括号中来指定类型,如vector ivec。
定义和初始化vector对象
vector v2 = v1 等价于v2(v1),v2中包含v1所有元素的副本
vector v1=10 错误
vector v1(10) 10个元素
vector v1{10} 一个元素值为10
列表初始化: vector v{“a”, “an”, “the”}; (C++11)

其他vector操作
v.push_back(e) 在尾部增加元素。
v.emtpy() 如果v不含有任何元素,返回真;否则返回假
v.size() 返回v中元素的个数
范围for语句内不应该改变其遍历序列的大小。
vector对象(以及string对象)的下标运算符,只能对确知已存在的元素执行下标操作,不能用于添加元素。
通过下标访问不存在的元素,缓存区溢出。

迭代器iterator
所有标准库容器都可以使用迭代器,其中少数其中同时支持下标操作。
类似于指针类型,迭代器也提供了对对象的间接访问。

使用迭代器
vector::iterator iter。
auto b = v.begin();返回指向第一个元素的迭代器。
auto e = v.end();返回指向最后一个元素的下一个(哨兵,尾后,one past the end)的迭代器(off the end)。
如果容器为空, begin()和 end()返回的是同一个迭代器,都是尾后迭代器。
使用解引用符*访问迭代器指向的元素。
养成使用迭代器和!=的习惯(泛型编程)。
容器:可以包含其他对象;但所有的对象必须类型相同。
迭代器(iterator):每种标准容器都有自己的迭代器。C++倾向于用迭代器而不是下标遍历元素。
const_iterator:只能读取容器内元素不能改变。
箭头运算符: 解引用 + 成员访问,it->mem等价于 (*it).mem
谨记:但凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。

标准容器迭代器的运算符:
*iter 返回迭代器iter所指向的元素的引用
iter->mem 等价于(*iter).mem
++iter 令iter指示容器中的下一个元素
iter1 == iter2 判断两个迭代器是否相等

养成使用迭代器和!=的习惯
for(auto it=test.begin(); it !=it.end() && !it->empty();++it)
只读元素 cbegin() cend() (C++11)

迭代器运算
iter + n 迭代器加上一个整数值仍得到一个迭代器,迭代器指示的新位置和原来相比向前移动了若干个元素。结果迭代器或者指示容器内的一个元素,或者指示容器尾元素的下一位置
iter - n 同上
iter1 - iter2 两个迭代器相减的结果是它们之间的距离,也就是说,将运算符右侧的迭代器向前移动差值个元素后得到左侧的迭代器。参与运算的两个迭代器必须指向的是同一个容器中的元素或者尾元素的下一位置。 没有iter1 + iter2 。

数组
长度固定的低级版vector

定义和初始化
初始化:char buff[buff_size]; buff_size必须是const表达式,或者不写,让编译器自行推断;
数组不运行直接赋值给另一个数组,是编译器标准特性导致的,它可扩展。

访问数组元素
数组下标的类型:size_t,一种机器相关的无符号类型
字符数组的特殊性:char a[6]=“hello”; 结尾处有一个空字符。
用数组初始化vector:int a[]={1 ,2 ,3 ,4}; vector v (begin(a),end(a));

数组和指针
很多场景下使用数组名时,编译器自动替换为一个指向数组首元素的指针。
标准库类型限定使用的下标必须是无符号类型,而内置的下标运算无此要求。

C风格字符串
用空字符\0结束。
string标准库比使用C风格字符串更安全、更高效,cstring头文件是string.h里面的C++版
strlen§ 返回长度 不计算\0
strcmp(p1,p2) 0-相等 ;1大于2返回正值 否则为负值
strcat(p1,p2) p2附加到p1后面,返回p1.
strcpy(p1,p2) 将p2拷贝给p1,同上。

多维数组
数组的数组,一个维度表示数组本身大小、另一个表示元素(数组)的大小。
int a[3][4] ={{1,2,3,4}…}.
使用范围for语句时,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型,为避免编译器转换成指向该数组内首元素的指针.

指向指针的指针
int **ppi=&pi;
解引用: (*ppi)

动态数组
new delete 类似 C的malloc free ,在堆(自由存储区)中分配空间
int *pia =new int[10];
delete [] pia。

时间比较紧,闲下来才有时间学习,后面有必要的话,再优化排版…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值