1.抽象数据类型ADT:使用标准库定义的抽象数据类型时不关心它们如何表示,只需要知道它们支持什么操作。
2.using声明:命名空间的说明
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::string;
3.标准库string类型:支持长度可变对的字符串。
(1)定义和初始化:初始化类需要用构造函数。
string s1; //默认构造函数,s1是空串
string s2(s1);
string s3("value");
string s4(n,'c');
(2)对象读写:读取并忽略开头所有的空白字符,再次遇到空白字符读取终止。输入" Hello World! ",输出是 "Hello"。除非已知string对象中单词的数目,分别定义两个string对象,输出为"HelloWorld!"
(3)未知数目的string对象:
string word;
while(cin>>word)
cout<<word<<" ";
(4)getline读取全部文本:读取整行数据直到换行符出现为止,getline停止读入并返回。
string line;
while(getline(cin,line))
cout<<line<<endl;
(5)string对象的操作
size操作:s.size()返回的是标准库类型string::size_type,而不是int型。
string对象的大小:大写字母位于小写字母之前,位置越靠后的字母越大。比较string对象的第一个不匹配的字符,来判断string对象的大小。若长度不同,且短的部分和长的前半部分相同,则长的string对象更大。
string对象的相加:若是两个string直接连接就好。若其中一方为字符串字面值,也可以直接连接。但不允许+两边都是字符串字面值。
string取字符:下标从0开始。而且[]中必须是一个string::size_type类型的值。
(6)对string中字符的处理 :函数均定义在cctype头文件中。
string s("Hello World!!!");
string::size_type punct_cnt = 0;
for(string::size_type index = 0;index!=s.size();++index)
{
if(ispunct(s[index]))
++punct_cnt;
s[index] = tolower(s[index]);
}
cout<<punct_cnt
<<" punctuation charactors in " << s <<endl;
4.标准库vector类型
(1)vector的概念
vector是同一种类型的对象的集合,称为容器,因为它可以包含其他对象。一个容器中的所有对象都必须是同一种类型的。vector是一个类模板class template,而不是一种数据类型。只有当vector指定了保存哪种类型的对象,vector<int>,vector<string>才是数据类型。
(2)vector定义和初始化
虽然可以给给定元素个数的vector对象预先分配内存,但更有效的方法是先初始化一个空vector对象,然后再动态的增加元素。
(3)vector操作
v.size():返回值是vector<T>::size_type
v.push_back():在v的末尾增加一个值为t的元素。
string word;
vector<string> text;
while(cin>>word)
text.push_back(word);
for(vector<string>::size_type ix = 0; ix!=text.size();++ix)
cout<<text[ix]<<" ";
cout<<endl;
只能对已经存在的vector元素使用下表操作。因此不能用下标操作去添加元素,而要用push_back。
5.迭代器iterator:一种检查容器内元素并遍历元素的数据类型。标准库对所有容器都定义了一种迭代器类型,提供了除了下标操作之外更通用的元素访问的方法。
(1)容器的iterator类型:各个容器都定义了各自的名为iterator的成员。
vector<int>::iterator iter;
(2)迭代器的操作:若vector不是空,则v.begin()返回的迭代器指向容器v中的第一个值v[0],而v.end()返回的迭代器指向末尾元素的下一个。若vector是空,则begin和end返回的迭代器相同。
(3)迭代器可以使用解引用操作符来访问其指向的元素。这里使用下标操作,即使容器是空也安全,因为在ix!=ivec.size()时循环就停止了。
for(vector<int>::iterator iter = ivec.begin(); iter!=ivec.end();++iter;)
*iter = 0;
(4)const_iterator:只能读取容器内的元素,迭代器本身可以自增和读取,但不能改变其指向元素的值。
const vector<T>::iterator: const的迭代器,必须初始化,并不能改变指向。
(5)迭代器算数操作:
iter+n,iter-n: 加减的值必须是该vector的size_type或者difference_type类型。
iter1-iter2:两个迭代器的距离也是difference_type的signed类型。
6.标准库bitset类型
(1)定义和初始化:bitset也是类模板,需要指定含有多少位。bitset输出位数从左到右为32位,31位....0位。string最右的字符即下标最大的字符用来初始化bitset对象的最低位。可以直接输出bitvec输出二进制位。
bitset<32> bitvec:均初始化为0。
bitset<16> bitvec1(0xffff):1111 1111 1111 1111。
bitset<32> bitvec2(0xffff): 0000 0000 0000 0000 1111 1111 1111 1111。
string straval("1100");bitset<16> bitvec3(straval): 0000 0000 0000 1100。
string str("1111 1110 0000 0011 0110 1");bitset<16> bitvec4(str,5,4): 1100。
(2)测试对象:count返回的是size_t的类型,定义在cstddef头文件中。
bool is_set = bitvec.any();
size_t bits_set = bitvec.count();
size_t sz = bitvec.size();
(3)访问对象位:可以下标访问,也可以用set,test,reset来设置对象的值。
(4)对整个对象:bitvec.reset();bitvec.flip();
(5)获取对象的值:当bitset类型的长度小于或等于unsigned long的长度,即小于或等于32位时,可以使用to_long操作。
unsigned long ulong = bitvec.to_ulong();
cout<<"ulong = "<<ulong<<endl;