1. 标准库string
1-1:声明:#include<string> usingstd::string; //或者using namespace std;
1-2:string对象常用的构造函数
string s1; //默认构造函数,s1为空串
string s2(s1); //将s2初始化为s1的一个副本
string s3(“value”); //将s3初始化为一个字符串字面值副本
string s4(n,’c’); //将s4初始化为字符’c’的n个副本
1-3:string对象的读写 cin>>str; cout<<str;
读取并忽略开头所有的空白字符(如空格、换行符、制表符)
读取字符直至再次遇到空白字符,读取终止
对未知数目string的读入
string str;
while(cin>>str)
cout << str << endl;
当输入无效字符时停止循环(输入Ctrl+Z)
1-4:getline读取整行文本,不包括换行符,且不忽略航开头的换行符。
getline的参数:istream输入流对象和 string对象
1-5:string常用操作
str.empty(); 如果str为空串,返回true否则返回false bool型
str.size(); 返回s中字符的个数 size_type型
str[n]; 返回str中位置为n的字符,位置从0开始计数 char型
str1+str2; 字符串连接,返回新的字符串 string型。(+左右必须至少有一个是string,不能都是字面值)
str1 += str2; 将str2追加到str1后面
str1 = str2; 字符串赋值
str1 == str2;判等操作 相等返回true否则返回false bool型
!= 、<、 <=、 >、>= 保持常有含义
1-6:补充string::size_type
事实上size()返回的是string::size_type类型的值。size_type即为unsigned型。
size_type存储的string长度是int型所能存储的两倍。所以为了存储大文本string,避免溢出,保存string对象size最安全的方法就是使用string::size_type类型,例如:
string str;
cin >> str;
string::size_type st = str.size();
1-7:字符串比较大小:(与字典排序相同策略,字典中排在前面的小于排在后面的)
如果连个string长度不同,且短的string对象与长的string对象的前面部分相匹配,则短的string对象小雨长的string对象;
如果两个string对象的字符不同,则比较第一个不匹配的字符。
string str1 = “Hello”; string str2 = “Hello World”; string str3 = “Hiya”;
则 str1 <str2; str3 > str1; str3 > str2;
1-8:赋值本质:string str= “Hello”; sting str2 = “World”; str1 = str2;
先把str1占用的相关内存释放掉,再分配足够str1存放str2副本的内存空间,最后把str2中的所有字符复制到新分配的内存空间。
1-9:单个char字符处理
2. 标准库vector
2-1:vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。和string对象一样,标准库将负责管理与存储元素相关的内存。我们把vector成为容器,可以包含其他对象(同一类型)。必须有的声明:
#include<vector>
using std::vector;
2-2:vector是一个类模板。
2-3:vector对象的定义和初始化:
vector<T>v1; vector保存类型为T的对象。默认构造函数v1为空
vector<T> v2(v1); v2是v1的一个副本
vector<T>v3(n,i); v3包含n个值为i的元素
vector<T>v4(n); v4含有值初始化的元素的n个副本
2-4:vector支持动态增长。push_back();函数
2-5:vector常用操作:
v.empty(); 如果v为空,返回true否则返回false
v.sizse(); 返回vector中个数 size_type类型
v.push_back(t); 增加一个值为t的元素
v[n]; 返回v中位置为n的元素
v1= v2; 赋值
v1== v2; 判等
!=、<、>、<=、>= 比较
3. 迭代器iterator。迭代器是一种检查容器(必须是容器类,例如vector)内元素并遍历元素的数据类型。
3-1:每种容器类型都定义了自己的迭代器类型,如vector:
vector<int>::iterator iter; //int型的vector迭代器定义语句
3-2:begin和end操作。
iverc.begin(); 返回迭代器指向的第一个元素vector<int>::iterator iter =iverc.begin();
iverc.end(); 超出末端迭代器。end操作返回的迭代器指向vector的“末端的下一个”起到哨兵的作用。
3-3:自增和解引用运算(*)
*iter返回迭代器当前所指向的元素。(*称为解引用操作符)
iter++;则迭代器向前移动一个位置,指向容器中的下一个元素
3-4:const_iterator该类型只能用于读取容器内元素,不能改变其值。
注意:中间有下划线,不是constiterator
const声明的iterator对象必须生声明时初始化,一旦初始化后,就不能改变,自增等操作都不可以实现。
const_iterator对象可以用constvector或非const vector,因为不能改写元素值。const迭代器这种类型几乎没什么用处:一旦它呗初始化,只能用它来改写其指向元的元素,但不能使它指向任何其他元素。
每日三题(2012-07-31)
(1)读一组整数到vector对象,计算并输出每对相邻元素的和。如果读入元素个数为奇数,则提示用户最后一个元素没有求和,并输出其值。然后修改程序:头尾元素两两配对(第一个和最后一个,第二个和倒数第二个,以此类推),计算每对元素的和,并输出。
(2)读入一段文本到vector对象,每个单词存储为vector中的一个元素。把vector对象中每个单词转换为大写字母。输出vector对象中转化后的元素,每八个单词为一行输出。
(3)编写程序来创建有10个元素的vector对象。用迭代器把每个元素值改为当前值的2倍。