第三张 标准库类型(using,string,vector)
一、命名空间的using声明
1、使用using声明,我们就可以直接引用名字,而不需要再引用该名字的命名空间:(参考下面部分代码)
#include <string>
#include <iostream>
using std::cin;
using std::string ;
int main()
{
string s; 正确,原来std::string,现在改成string
cin >> s; 正确
cout << s; 有错,因为上面没有using std::cout;
std:: cout << s; 正确
}
需要注意的是,每个名字都要一个using声明。此外,在一种情况下,必须总是使用完全限定的标准库名字,即在头文件中。(会引起不必要的错误)
二、标准库string类型
1、string标准库支持几个构造函数:
String s1; 默认构造函数,s1为空串
String s2(s1); 将s2初始化为s1的一个副本
String s3("Value") ; 将s3初始化为一个字符串字面值副本
String s4(n,'c'); 将s4初始化为字符‘c’的n个副本
2、string 对象的读写
当string s;
Cin >> s; string类型的输入操作符:读取并忽略开头所有的空白字符(空格,换行符,制表符); 读取字符直到再次遇到空白字符,才终止读取。如:输入“hello world”,输出 “hello”,且不含任何空格。
3、用getline 读取整行文本
Getline接受两个参数,getline(cin,line); 函数从输入流的下一行读取,并保存读取的内容到string中,但不包括换行符。另外,getline并不忽略行开头的换行符,只要getline遇到换行符,即便是第一个字符,也将停止输入并返回。如果第一个字符是换行符,则line为空串。
4、string对象的操作
假设 string s;
S.empty() 如果s为空串,则返回true,否则返回false。
S.size() 返回s中字符的个数
S[n] 返回s中位置为n的字符,从0开始计数。
S1+s2 把两个串连接成一个新字符串,并返回。
S1=s2 把s1内容替换为s2的副本
S1==s2 比较s1,s2的内容,相等则返回true,否则返回false
!=, < , <= , > , >= 与C语言类似.
注意:(1)s.size()返回的是string::std::size_type类型的值,特别的,不能将这个值赋给一个int 变量!
(2)连接字符串字面值时候,+ 操作符的左右操作数必须至少有一个是string类型的。
例如: string s3= s1+ " , " ; string s5=s1+" , "+ "world" ; s5中,先是将s1和" , " 相加组成一个新的string对象,然后再与"world " 相加。
错误示范: string s4= "hello " + " , " ; 两个字符串字面值相加是非法的。
String s6= "hello " + " , " + s2;
(3)在string对象的索引变量最好也是用string::size_type类型,因为方便比较: ix != s.size() (越界控制)
(4)String对象中字符的处理,见C++Primer P77
三、标准库vector 类型
1、vector是同一类型的对象的集合,每个对象都有一个对应的整数索引值。常称vector为容器,它包含的对象都必须是同一类型的。(假设 用using做出了相应声明: #include<vector>
Using std:: vector ;)
2、定义vector的对象:需要指定类型和一个变量的列表。
如:vector<int> ivec;
3、vector对象的定义和初始化
四个构造函数:
(1)vector<T> v1; 类型为T的对象v1为空
(2) vector<T> v2(v1); v2是v1的一个副本
(3) vector<T> v3(n,i); v3包含n个值为i的元素
(4) vector<T> v4(n); v4含有值初始化的元素的n个副本
4、vector对象的操作
v.empty() 如果v为空,则返回true,否则返回false。
v.size() 返回v中元素的个数
v.push_back(t) 在v的末尾增加一个值为t的元素
v[n] 返回v中位置为n的元素,从0开始计数。
v1=v2 把v1元素替换为v2中元素的副本
v1==v2 如果v1,v2相等则返回true,否则返回false
!=, < , <= , > , >= 与C语言类似.
注意:使用size_type类型时,必须指出该类型时在哪里定义的。Vector类型总是包括vector的元素类型: vector<int> :: size_type
5、下标操作不能添加元素
因为下标只能用于获取已存在的元素,而当一个空对象没有元素时,是无法通过下标操作获取元素的。已存在的元素才能用下标操作进行索引,而通过下标操作赋值时,不会添加任何元素。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
今天学习了const,typedef,枚举和现在贴上来的标准库string类型和vector类型,以及using命名声明。重点是现在贴上来的笔记了,感觉在看书过程中思路还算清晰吧,遇到一个小问题,问师兄和百度后最终解决了,就是using在头文件的使用,在上面的笔记也有记录。 今晚师兄跟我聊了一下vector类型,他告诉我,如果在学完这章书后能够用vector实现一个栈,那就算是真正学懂了!这也算学完这章书的一个小目标吧,今天写在这里,我会在学完这章后写一个出来的,到时候再贴上!加油! 23:00