除第2章介绍的基本数据类型外,C++还定义了一个内容丰富的抽象数据类型标准库。
3.1命名空间的using声明
在编译我们提供的实例程序前,读者一定要注意在程序中添加适当的#include和using说明。
有一种情况下,必须总是使用完全限定的标准库名字:在头文件中
3.2标准库string类型
编程时一定要注意区分字符串字面值和string数据类型的使用。
string类型输入:读取并忽略开头所有空白字符,直至再次遇到空白字符读取终止。
getline:接受两个参数,一个输入流对象和一个string对象,从输入流下一行读取,遇到换行符终止并丢弃换行符。
任何存储string的size操作结果的变量必须为string::size_type类型。不要把size返回值赋给int变量。
为避免溢出,保存一个string对象size最安全的方法是使用标准库类型string::size_type。
当进行string对象和字符串字面值混合连接时,+操作符的左右操作数必须至少一个是string类型。
下标操作符需要取一个size_type类型的值,来标明要访问字符的位置。
C++程序员应采用cname这种头文件版本,而不是name.h版本,这样标准库中的名字在命名空间std中保持一致。使用.h版本会给程序员带来负担,因为他们必须记得哪些标准库名字是从C继承过来的,哪些是C++所特有的。
3.3标准库vector类型
vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。
定义vector对象要指定类型和一个变量的列表。
虽然可以对给定元素个数的vector对象预先分配内存,但是更有效的方法是先初始化一个空的vector对象,然后再动态的增加元素。
push_back()操作接受一个元素值,并将它作为一个新的元素添加到vector对象的后面。
C++程序员习惯于优先使用!=而不是<来编写循环判断条件。
3.4迭代器简介
迭代器是一种检查容器内元素并遍历元素的数据类型。
每个标准容器类型都定义了一个名为iterator的成员,这里的iterator与迭代器实际类型的含义相同,这种类型支持迭代器的各种操作。
end操作返回的迭代器不指向任何元素。
不要把const_iterator对象和const的iterator对象混淆。
迭代器加上或者减去的值应该是vector的size_type或者difference_type类型。
3.5标准库bitset类型
定义bitset时,要明确bieset含有多少位,须在尖括号中给出它的长度值。
string对象的最右面字符用来初始化bitset对象低阶位。
count操作的返回类型是标准库中命名为size_t的类型。size_t定义在cstddef头文件中。
相对于C++内置数据的数组和指针而言,程序员应优先使用标准库类类型。
习题3.5 从标准输入每次读入一行文本
#include<iostream> #include<string> using namespace std; int main() { string line; while(getline(cin,line)) cout<<line<<endl; return 0; }
习题3.8 从标准输入读入多个string对象并连接起来,连接后对象以空格隔开
#include<iostream> #include<string> using namespace std; int main() { string sumstr,str; cout<<"Enter strings(Ctrl+Z to end):"<<endl; while(cin>>str) sumstr=sumstr+' '+str; cout<<"string equal to the concatenation of these strings is:" <<endl<<sumstr<<endl; return 0; }
习题3.10
#include<iostream> #include<string> #include<cctype> using namespace std; int main() { string str,xstr; bool has_punct=false; char ch; cout<<"Enter a string:"<<endl; getline(cin,str); for(string::size_type index=0;index!=str.size();index++) { ch=str[index]; if(ispunct(ch)) has_punct=true; else xstr+=ch; } if(has_punct) cout<<"result:"<<endl<<xstr<<endl; else {cout<<"No pounctuation character in the string?!"<<endl; return -1; } return 0; }
习题3.14
#include<iostream> #include<string> #include<vector> #include<cctype> using namespace std; int main() { vector<string> svec; string str; cout<<"Enter text(Ctrl+Z to end):"<<endl; while(cin>>str) svec.push_back(str); cout<<"Transformed elements from the vector:"<<endl; for(vector<string>::size_type ix=0;ix!=svec.size();++ix) { for(string::size_type index=0;index!=svec[ix].size();++index) if(islower(svec[ix][index])) svec[ix][index]=toupper(svec[ix][index]); cout<<svec[ix]<<" "; if((ix+1)%8==0)cout<<endl; } return 0; }