【c++ Primier】第三章 标准库类型--string,vector以及bitset

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标记范围内所有的元素。返回指向被删除元素段后面元素的迭代器
  • 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的引用
  • 只适用于string类型的操作:
    • substr操作
      • s.substr(pos,n)
        • 返回一个string类型的字符串,从下标pos开始的n个字符
      • s.substr(pos)
        • 返回一个string类型的字符串,从pos下标开始到字符串结尾
      • s.substr()
        • 返回s的副本
    • 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标记范围内所有字符
  • 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都没有默认值。

(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个字符作比较
  • cin和getline()
    • cin
      • 读取并忽略开头所有的空白字符(如空格,换行符,制表符),读取字符直至再次遇到空白字符,读取终止。
    • getline
      • c标准库头文件命名形式为name.h,而c++版本则命名为cname,少了后缀.h而在头文件名前加了c。通常,c++程序中应采用cname这种头文件版本,而不采用name.h版本,这样,标准库中的名字在命名空间std中保持一致。
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对象的操作:
    • v.empty()
      • v是否为空,为空返回true,非空返回false
    • v.size()
      • v的元素个数
    • v.push_back(t)
      • 在v的末尾添加一个值为t的元素
  • 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对象的操作
    • 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流

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值