标准库类型:
标准库类型是C++自定义的抽象数据类型标准库。如string, vector, bitset等。
命名空间的using声明:
using namespace::name
标准库stringe类型的使用:
#include <string>
using std::string;
标准库string对象的定义和初始化:
string s1; 或者
string s2(s1); 或者
string s3(“value”); 或者
string s4(n,’c’);
注意,字符串字面值类型与标准库string类型不是一个类型。因此,尽管有string s3(“value”),仅表示讲string类型的s3初始化为value字符串字面值的副本。
标准库string对象的读写:
1读取忽略开头所有的空白字符(空格,换行符,制表符)。
2读取字符直到再次遇到空白字符。
以上规则的应用如下,读入未知数目的string类对象,放入读入语句while循环的条件判断中。
int main()
{
string word;
while(cin>>word);//
cout<<word<<endl;
return 0;
}
用输入操作符cin来读取string对象,该操作符返回所读的istream对象。在读取结束后,作为while的判断条件,如果输入流失有效的,即还未到达文件尾且遇到无效输入,则执行while循环体,并将读取到的字符串输出到标准输出。如果到了文件尾,则跳出循环。
使用getline读取整行文本:
这个函数接受两个参数:一个输入流对象和一个 string 对象。getline 函数从输入流的下一行读取,并保存读取的内容到string中,但不包括换行符。和输入操作符不一样的是,getline 并不忽略行开头的换行符。只要 getline 遇到换行符,即便它是输入的第一个字符,getline 也将停止读入并返回。如果第一个字符就是换行符,则 string 参数将被置为空 string。
int main()
{
string line;
// read line at time until end-of-file
while (getline(cin, line))
cout << line << endl;
return 0;
}
string::size_type类型
string类类型和许多其他哭类型都定义了一些配套类型,它们使得库类型的使用和机器无关。size_type与unsigned int或者unsigned long有差不多的含义。注意不要把size_type类型赋值给int,否则会越界。
string和字符串字面值的连接:
当string和字符串字面值连接时,+操作符的左右操作数必须至少有一个是string类型。
因此,string s=s1+”,”+”world”是合法操作。因为string标准库定义家操作返回一个sttrign对象,第一个”+”操作符将返回一个string对象,它将和后面的字面值”world”连接。
string的下标操作符[]:
可以使用string的下标操作符[]来访问string对象中的单个字符。string的下标操作符可以放在赋值操作符的左边或者右边。注意下标的索引范围不要越界,并且最好用size_type类型来定义。
标准库vector类型:
vector本质上是一个类模板,是一个可以放入各种类型的容器。
vector<int> ivec;
vector<string> svec;
vector的定义和初始化:
vector<T> v1;或者
vector<T> v2(v1);或者
vector<T> v1(n,i);或者
vector<T> v1(n);或者
vector的重要特性1:
可以动态添加元素。因此可以先初始化一个空的vector对象,再按需添加元素。
vector的下标操作:
类似string中的下标操作。
for(vector<int>::size_type ix=0;ix!=ivect.size();++ix)
ivec[ix]=0;
下标操作只能用来获取元素,不能用来添加元素。
标准库iterator类型:
实际上,每种容器类型都定义了自己的迭代器iterator类型,用来检查容器类元素并遍历元素。
迭代器begin()与end()操作
vector<int>::iterator iter1=ivec.begin();//指向容器第一个元素
vector<int>::iterator iter2=ivec.end();//指向容器的末端元素的下一个元素。
若ivec.begin()==ivec.end(),则说明容器为空。
迭代器的解引用:
*iter1=0; //*iter可以用来访问和赋值
const_iterator:
只能用于读取容器中的元素,不能改变其值。
与const类型的iterator是两回事。const类型的iterator没法做遍历,只能指向一个元素,可以改变这个元素的值。
迭代器的算术操作:
iterator+n, iterator-n//加上或者减去的值的类型是vector的size_type或者difference_type类型。
通过迭代器来遍历:
for (vector<int>::iterator iter = ivec.begin();iter != ivec.end(); ++iter)
*iter = 0;
如果 vector 为空,程序是安全的。如果 ivec 为空,则 begin 返回的迭代器不指向任何元素——由于没有元素,所以它不能指向任何元素。在这种情况下,从 begin 操作返回的迭代器与从 end 操作返回的迭代器的值相同,因此 for 语句中的测试条件立即失败。
标准库的bitset类型
bitset<32> bitvec//
bitset也是一种类模板,这点和vector类似。但是bitset是一个位集(每个位可能为1或0),因此在只需在尖括号内明确给出它有多少位。