1. 标准库string类型
string 类型支持长度可变的字符串,标准库string类型的目的就是满足对字符串的一般应用。
使用string类型对象,必须包含相关头文件即:(#include”string”)
1.1 string对象的定义和初始化
//几种初始化string对象的方式
string s1; //默认构造函数,s1为空串
string s2(s1); //将s2初始化为s1的一个副本
string s3("hello") //将s3初始化为一个字符串字面值副本
string s4(n, 'c'); //将s4初始化为字符'c'的n个副本
注:字符串字面值与标准库string类型不是同一种类型。
- 它们都是以’\0’结尾
string s1("value");
for (string::size_type i = 0;s1[i] != '\0'; ++i)
cout << s1[i] << ' ';
cout << endl;
- 其次它们根本不是同一种类型
string s1 = "ABC";
char s2[] = "CDE";
string tmp = s1;
s1 = string(s2);
strcpy(s2,tmp.c_str());
cout << s1 << endl;
cout << s2 << endl;
1.2 string对象的操作
//string操作
s.empty() //如果s为空串,则返回true,否则返回flase
s.size() //返回s中字符个数
s[n] //返回s中位置为n的字符,位置从0开始计数
s1 + s2 //把s1、s2连接成一个新字符串,返回新生成的字符串
s1 = s2 //把s1内容替换为s2的副本
v1 == v2 //比较v1、v2的内容,相等则返回true,否则返回flase
1.2.1 string::size_type类型
string类类型和许多其他库类型都定义了一些配套类型,通过这些配套类型,库类型的使用就能与机器无关。string::size_type类型可以保证足够大到能够存储任意string对象的长度。
string str = "Hello World";
string::size_type length = str.size();
1.2.2 string对象赋值
string s1, s2="hello";
s1 = s2;
注:赋值操作需要做一些操作:它必须把s1占用的相关内存释放掉,然后再分配给s1足够存放s2副本的内存空间,最后把s2中所有的字符都复制到新分配的内存中!
1.2.3 从string对象获取字符
可用下标操作符([])分别取出string对象的每个字符,分行输出。string对象str下标的取值范围:0~str.size()-1
string str ("Some thing!");
for (string::size_type index = 0; index != str.size(); ++index)
cout << str[index] <<endl;
注:下标操作可用作左值(str[index] = ‘*’;)
1.2.4 string对象中字符的处理
/*
isalnum,isalphaiscntrl,isdigit,isgraph,islower,isprint,ispunct,isspace,isupper,isxdigit,tolower,toupper.
*/
isalnum(c) //如果c是字母或者数字,则为true
islower(c) //如果c是小写字母,则为true
tolower(c) //如果c是大写字母,则返回其小写字母形式,否则直接返回c
2. 标准库vector类型
vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。和string对象一样,标准库将负责管理与存储元素相关的内存。我们将vector称之为容器,一个容器中的所有对象都必须是同一类型的。(#include”vector”)
2.1 vector对象的定义和初始化
//几种初始化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个副本
注: 1)如果vector对象保存的是内置数据类型(如:int),那么标准库将用0值创建元素初始化式。
2)如果vector保存的是含有构造函数的类类型的元素,那么标准库将用该类型的默认构造函数创建元素初始化式。
3)如果vector保存的类类型元素没有默认构造函数,程序员就不能仅提供元素个数,还要提供初始值。
2.2 vector对象的操作
//vector操作
v.empty() //如果v为空,则返回true,否则返回flase
v.size() //返回v 中元素的个数
v.push_back(t) //在v的末尾增加一个值为t的元素
v[n] //返回v中位置为n的元素
v1 = v2
v1 == v2
2.2.1 向vector添加元素
push_back()操作接受一个元素值,并将它作为一个新的元素添加到vector对象的后面,也就是“插入(push)”到vector对象的“后面(back)”。
string word;
vecctor<string> text;
while(cin >> word){
text.push_back(word);
}
2.2.2 vectord下标操作
vector的下标操作符接受一个值,并返回vector中该对应位置的元素。
//每个元素重置0
for(vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)
ivec[ix] = 0;
3. 标准库bitset类型
有些程序要处理二进制的有序集,每个位可能包含0值或者1值。位是用来保存一组项或条件的yes/no信息的简洁方法。标准库bitset类简化了位集的处理(#include”bitset”)。
3.1 bitset对象的定义和初始化
与vector不一样的是bitset类型对象的区别仅在其长度二不在其类型。在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度。
bitset<32> bitvec; //32bits,all zero
注:位集合的位置编号从0开始。
//四种初始化bitset的方法
bitset<n> b; //b有n位,每位都为0
bitset<n> b(u); //b是unsigned long型u的一个副本
bitset<n> b(string); //b是string对象s中含有的位串的副本
bitset<n> b(string,pos,m); //b是s中从位置pos开始的n个位的副本
3.2 用string对象初始化bitset对象
位集合的位置编号从0开始,但是,他的顺序是从右往左排的!以0位开始的位串是低阶位,以n结尾的是高阶位!
/*
用string对象初始化bitset对象
仍然是从右往左:string对象的最右边字符,用来初始化bitset对象的低阶位!
*/
string str("1100");
bitset<16> b(str);
string str("1000110011101111");
bitset<4> b(str); //从左边开始截取
总结:
- string类型提供了变长的字符串,而vector类型则可用于管理同一类型的对象集合。
- 迭代器(
vector<int>::iterator iter = ivec.begin()
)实现了对存储于容器中对象的间接访问。迭代器课用于访问和遍历string类型和vector类型元素。