1. string
(1)几种初始化string对象的方式(飘红的为最常用的)
- string s1
- 默认构造函数,s1为空串
- string s2(s1)
- 将s2初始化为s1的一个副本
- string s3("value")
- 将s3初始化为一个字符串字面值副本
- string s4(n, 'c')
- 将s4初始化为字符'c'的n个副本
- string s(cp)
- 用cp指向的C风格字符串初始化该对象。
- string s(cp,n)
- 初始化为cp所指向数组的前n个元素
- string s(s2,pos);
- 初始化为字符串s2从下标0开始到pos2的字符副本
- string s(s2,pos2,len2)
- 初始化为字符串s2下标从pos2开始的len2个字符的副本
(2)string对象的操作:
- s.empty()
- 字符串是否为空,为空返回true;非空返回false
- s.size()
- 字符串大小,size()函数返回的数据类型为string:size_type,不要把size的返回值赋给一个int变量
- s1+s2
- 字符串连接,不允许将两个字符串字面值连接起来,例如:string s="ni"+"hao";是非法的。
- 与容器共有的string操作:
- s.insert(p,t)
- 在迭代器p指向的元素之前插入一个值为t的新元素。返回指向新插入元素的迭代器
- s.insert(p,n,t)
- 在迭代器p指向的元素之前插入n个值为t的新元素。返回void
- s.insert(p,b,e)
- 在迭代器p指向的元素之前插入迭代器b和e标记范围内所有的元素。返回void
- s.assign(b,e)
- 用迭代器b和e标记范围内的元素替换s,对于string类型,返回s;对于容器类型,返回void。
- s.assign(n,t)
- 用值为t的那个副本替换s。对于string类型,返回s;对于容器类型,返回void。
- s.erase(p)
- 删除迭代器p指向的元素。返回指向被删除元素后面元素的迭代器。
- s.erase(b,e)
- 删除迭代器b和e标记范围内所有的元素。返回指向被删除元素段后面元素的迭代器
- s.insert(p,t)
- string类型特有的版本:
- s.insert(pos,n,c)
- 在下标为pos的元素之前插入n个字符c
- s.insert(pos,s2)
- 在下标为pos的元素之前插入string对象s2的副本
- s.insert(pos,s2,pos2,len)
- 在下标为pos的元素之前插入s2中从pos2开始len个字符
- s.insert(pos,cp,len)
- 在下标为pos的元素之前 插入cp指向数组的前len个字符
- s.insert(pos,cp)
- 在下标为pos的元素之前插入cp所指向的以空字符结束的字符串副本
- s.assign(s2)
- 用s2的副本替换s
- s.assign(s2,pos2,len)
- 用s2中从pos2开始的len个字符副本替换s
- s.assign(cp,len)
- 用cp指向的字符数组的前len个字符替换s
- s.assign(cp)
- 用cp指向的以空字符结尾的字符串副本替换s
- s.erase(pos,len)
- 删除s中从下标pos开始的len个字符
- 注解:除非特殊声明,上述所有操作都返回s的引用
- s.insert(pos,n,c)
- 只适用于string类型的操作:
- substr操作
- s.substr(pos,n)
- 返回一个string类型的字符串,从下标pos开始的n个字符
- s.substr(pos)
- 返回一个string类型的字符串,从pos下标开始到字符串结尾
- s.substr()
- 返回s的副本
- s.substr(pos,n)
- append和replace函数
- s.append(args)
- 将args串接在s后面。返回s的引用
- s.replace(pos,len,args)
- 删除s中从下标开始的len个字符,用args指定的字符替换之。返回s的引用。在这个版本中,args不能为b2,e2
- s.replace(b,e,args)
- 删除迭代器b和e标记的范围内所有的字符,用args替换之。返回s的引用。在这个版本中,args不能为s2,pos2,len2
- append和replace操作的参数:args
- s2
- string类型的字符串
- s2,pos2,len2
- 字符串s2中从下标pos2开始的len2个字符
- cp
- 指针cp指向的以空字符结束的数组
- cp,len2
- cp指向的以空字符结束的数组中的前len2个字符
- n,c
- 字符c的n个副本
- b2,e2
- 迭代器b2和e2标记范围内所有字符
- s2
- s.append(args)
- substr操作
- string类型的查找操作
- s.find(args)
- 在s中查找args的第一次出现
- s.rfind(args)
- 在s中查找args的最后一次出现
- s.find_first_of(args)
- 在s中查找args的任意字符的第一次出现
- s.find_last_of(args)
- 在s中查找args的任意字符的最后一次出现
- s.find_first_not_of(args)
- 在s中查找第一个不属于args的字符
- s.find_last_not_of(args)
- 在s中查找最后一个不属于args的字符
- string类型提供的find操作的参数args
- c,pos
- 从下标pos标记的开始,查找字符c。pos的默认值为0
- s2,pos
- 在s中,从下标pos标记的位置开始,查找string对象s2。pos的默认值为0
- cp,pos
- 从下标pos标记的位置开始,查找指针cp所指向的C风格字符串。pos的默认值为0.
- cp,pos,n
- 从下标pos标记的位置开始,查找指针cp所指向数组的前n个字符。pos和n都没有默认值。
- c,pos
- s.find(args)
(3)string对象中字符的处理函数:(在cctype.h中定义)
- isalnum(c),isalpha(c),isdigit(c),islower(c),isspace(c),isupper(c)
- 顾名思义,都很简单
- isgraph(c)
- 是否c不是空格,但是可打印
- isprint(c)
- 是否是可打印字符
- ispunct(c)
- 是否是标点符号
- iscntrl(c)
- 是否是控制字符
- isxdigit(c)
- 是否是十六进制数
- tolower(c)
- 返回字符c的小写字母
- toupper(c)
- 返回字符c的大写字母
- string对象的比较:
- s.compare(s2)
- 比较s和s2
- s.compare(pos1,n1,s2)
- 让s中从pos1下标pos1开始的n1个字符与s2比较
- s.compare(pos1,n1,s2,pos2,n2)
- 让s中从pos1开始n1个字符与s2中从pos2开始的n2个字符比较
- s.compare(cp)
- 比较s和cp所指向的以空字符串结束的字符串
- s.compare(pos1,n1,cp)
- 让s中从pos1下标位置开始的n1个字符与cp所指向的字符串作比较
- s.compare(pos1,n1,cp,n2)
- 让s中从pos1开始的n1个字符与cp所指向字符串的前n2个字符作比较
- s.compare(s2)
- cin和getline()
- cin
- 读取并忽略开头所有的空白字符(如空格,换行符,制表符),读取字符直至再次遇到空白字符,读取终止。
- getline
- c标准库头文件命名形式为name.h,而c++版本则命名为cname,少了后缀.h而在头文件名前加了c。通常,c++程序中应采用cname这种头文件版本,而不采用name.h版本,这样,标准库中的名字在命名空间std中保持一致。
- cin
string line;
getline(cin, line) 只要getline遇到换行符,则getline将停止读入并返回。
2. vector
- 两个特性
- 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个副本
- vector<T> v1;
- vector对象的操作:
- v.empty()
- v是否为空,为空返回true,非空返回false
- v.size()
- v的元素个数
- v.push_back(t)
- 在v的末尾添加一个值为t的元素
- v.empty()
- vector的迭代器
- 每种容器都定义了一对命名为begin和end的函数,用于返回迭代器。begin返回的迭代器指向第一个元素,end返回的迭代器指向vector的“末端元素的下一个”。如果vector为空,begin返回的迭代器和end返回的迭代器相同。
- 迭代器类型可使用解引用操作符来访问迭代器所指向的元素,由于end返回的迭代器不指向任何元素,因此不能对end返回的迭代器进行解引用或者自增操作。
- const_iterator迭代器示例:
-
const_iterator迭代器,可以通过解引用来访问它所指向的元素的值,但是不能改变元素的值。
-
const vector<string>::iterator iter=str.begin() //表示的是该迭代器是一个常量,不能改变,这种const迭代器几乎没什么用处。
-
vector<string> str(10,"hello"); for(vector<string>::const_iterator iter = str.begin():iter!=str.end();++iter) { string s = *iter; *iter = "world";//error *iter is const }
-
-
迭代器的算术操作
-
iter+n iter1-iter2
-
- 值初始化
如果没有指定元素的初始化式,那么标准库将自行提供一个元素初始值进行值初始化。这个由库生成的初始值将用来初始化容器中的每一个元素,具体值为何,取决于存储在vector中的元素数据类型。
(1)如果vector保存内置类型(如int类型)的元素,那么初始值为0;例如:
vector<int> vec(10) //10个元素均初始化为0
(2)如果vector保存的事含有构造函数的类类型(如string)的元素,标准库将用给类型的默认构造函数进行初始化;例如:
vector<string> svec(10); //10各元素初始化为空字符串
(3)第三种可能性:元素类型可能是没有定义任何构造函数的类类型。这种情况下,标准库仍产生一个带初始值的对象,这个对象的每个成员进行了值初始化。
3. bitset
- bitset对象的定义和初始化
- bitset<n> b;
- b有n位,每位都为0
- bitset<n> b(u);
- b是unsigned long型u的一个副本
- bitset<n> b(s) ;
- b是string对象s中含有的位串的副本
- bitset<n> b(s,pos,n);
- b是s中从位置pos开始的n个位的副本
- bitset<n> b;
- bitset对象的操作
- b.any()
- b中是否存在为1的二进制位
- b.none()
- b中的二进制位是否都为0
- b.count()
- b的二进制1的个数
- b.size()
- b的二进制位数
- b[pos]
- 访问b中位置为pos的二进制位
- b.test(pos)
- 测试b中位置为pos的二进制位是否为1
- b.set()
- 将b的所有二进制位置1
- b.set(pos)
- 将b中pos位置的二进制位置1
- b.reset()
- 将b中所有位置0
- b.reset(pos)
- 将b中pos位置的二进制位置0
- b.flip()
- 将b中所有二进制位取反
- b.flip(pos)
- 将b中pos位置的二进制位取反
- b.to_ulong()
- 用b中同样的二进制位返回一个unsigned long值
- os << b
- 把b中的位集输出到os流
- b.any()