• C++ Primer学习笔记2--c++标准库中的 vector、string 和 bitset 类型


     一.string
     
     #include <string>
     using std::string
     
     初始化函数:
     
     string s1;        默认构造函数 s1 为空串
     string s2(s1);   将 s2 初始化为 s1 的一个副本
     string s3("value");将 s3 初始化为一个字符串字面值副本
     string s4(n, 'c');将 s4 初始化为字符 'c' 的 n 个副本    string s4(5,'6')  66666
     为了与 C 语言兼容,字符串字面值与标准
     库 string 类型不是同一种类型。
     
     
     cin >> s;
     从标准输入读取 string 并将读入的串存储在 s 中。string 类型的输入操 作符:
     • 读取并忽略开头所有的空白字符(如空格,换行符,制表符)。
     • 读取字符直至再次遇到空白字符,读取终止。
     
     读入未知数目的string对象《每行输出一个单词》
     string str;
     while (cin>>str) {
     cout<<str<<endl;
     }
     
     使用getline读取正行文本《每次输出一行文本》
     string line;
     while (getline(cin,line)) {
     cout<<line<<endl;
     }
     
     字符串操作符
     
     s.empty()
     如果 s 为空串,则返回 true,否则返回 false。
     
     s.size()
     返回 s 中字符的个数  返回类型:string::size_type。
     
     s[n]
     返回 s 中位置为 n 的字符,位置从 0 开始计数
     
     s1 + s2
     把 s1 和 s2 连接成一个新字符串,返回新生成的字符串
     
     s1 = s2
     把 s1 内容替换为 s2 的副本
     
     v1 == v2
     比较 v1 与 v2 的内容,相等则返回 true,否则返 回 false
     
     !=,<,<=,>,and>
     保持这些操作符惯有的含义
     #include<CCType.h>
     
     cctype 中的函数
     isalnum(c)
     isalpha(c)
     iscntrl(c)
     isdigit(c)
     isgraph(c)
     islower(c)
     isprint(c)
     ispunct(c)
     isspace(c)
     isupper(c)
     isxdigit(c)
     tolower(c)
     toupper(c)
     如果 c 是字母或数字,则为 True。 
     如果 c 是字母,则为 true。
     如果 c 是控制字符,则为 true 
     如果 c 是数字,则为 true。
     如果 c 不是空格,但可打印,则为 true。 
     如果 c 是小写字母,则为 true。
     如果 c 是可打印的字符,则为 true。 
     如果 c 是标点符号,则 true。
     如果 c 是空白字符,则为 true。
     如果 c 是大写字母,则 true。
     如果是 c 十六进制数,则为 true。
     如果 c 大写字母,返回其小写字母形式,否则直接返回 c。 
     如果 c 是小写字母,则返回其大写字母形式,否则直接返回 c。
     
     
     建议采用 C 标准库头文件的 C++ 版本,
     #include <cctype>   C建议采用此版本
     #include <ctype.h>  C++
     -------------------------------------------------
     
    二.vector 是同一种类型的对象的集合
     #include<vector>
     using std::vector;
     
     
     vector<int>  ivec;//vector不是一种数据类型,而是一种类模板,vector<int>是一种数据类型
     初始化
     
     vector<T> v1;
     vector 保存类型为 T 对象。
     默认构造函数 v1 为空。
     
     vector<T> v2(v1); 
     v2 是 v1 的一个副本。
     
     
     vector<T> v3(n, i);
     v3 包含 n 个值为 i 的元素。
     
     
     vector<T> v4(n); vector<int>v4(10);
     v4 含有值初始化的元素的 n 个副本。10 elements, each initialized to 0
     
     
     vector 对象的操作
     vector 标准库提供了许多类似于 string 对象的操作
     v.empty()
     如果 v 为空,则返回 true,否则返回 false。
     
     v.size()
     返回 v 中元素的个数。vector<int>::size_type  num;
     
     
     v.push_back(t)
     在 v 的末尾增加一个值为 t 的元素。
     
     v[n]
     返回 v 中位置为 n 的元素。
     
     v1 = v2
     把 v1 的元素替换为 v2 中元素的副本。
     
     v1 == v2
     如果 v1 与 v2 相等,则返回 true。
     
     !=, <, <=,
     >, and >=
     保持这些操作符惯有的含义
     
     关键概念:安全的泛型编程
     习惯于 C 或 Java 编程的 C++ 程序员可能会觉得难以理解,for 循环 的判断条件用 != 而不是用 < 来测试 vector 下标值是否越界。C 程序 员难以理解的还有,上例中没有在 for 循环之前就调用 size 成员函数 并保存其返回的值,而是在 for 语句头中调用 size 成员函数。
     C++ 程序员习惯于优先选用 != 而不是 < 来编写循环判断条件。在上例 中,选用或不用某种操作符并没有特别的取舍理由。学习完本书第二部 分的泛型编程后,你将会明白这种习惯的合理性。
     调用 size 成员函数而不保存它返回的值,在这个例子中同样不是必需 的,但这反映了一种良好的编程习惯。在 C++ 中,有些数据结构(如 vector)可以动态增长。上例中循环仅需要读取元素,而不需要增加新 的元素。但是,循环可以容易地增加新元素,如果确实增加了新元素的 话,那么测试已保存的 size 值作为循环的结束条件就会有问题,因为 没有将新加入的元素计算在内。所以我们倾向于在每次循环中测试 size 的当前值,而不是在进入循环前,存储 size 值的副本。
     我们将在第七章学习到,C++ 中有些函数可以声明为内联(inline)函 数。编译器遇到内联函数时就会直接扩展相应代码,而不是进行实际的 函数调用。像 size 这样的小库函数几乎都定义为内联函数,所以每次 循环过程中调用它的运行时代价是比较小的。
     每种容器类型都定义了自己的迭代器类型,用于访问容器内的元素,即,每个容器都定义了一个自己的 iterator
     如 vector:
     vector<int>::iterator iter;
     
     1.begin()/  end()
     
     for (vector<int>::iterator iter = text.begin();iter != text.end() ; iter++) {
     *iter = 4;
     
     }
     
     
     只能读取容器内元素,但是不可以改变
     vector<int>::const_iterator
     
     
     2.算数操作
     iter + n;
     iter1-iter2  defference_type
     
     三.bitset
     
     #include<bitset>
     using std::bitset;
     
     初始化
     bitset<n> b;   // b 有 n 位,每位都 0  bitset<32> b;
     
     bitset<n> b(u);//  b 是 unsigned long 型 u 的一个副本 bitset<32> b(0xffff); 
     // bits 0 ... 15 are set to 1, 16 ... 31 are 0
     
     
     bitset<n> b(s); // b 是 string 对象 s 中含有的位串的副本
     string strval("1100");
     bitset<32> bitvec4(strval);//从 string 对象读入位集的顺序是从右向左(from right to left):bitvec4 的位模式中第 2 和 3 的位置为 1,其余位置都为 0。如果 string 对 象的字符个数小于 bitset 类型的长度,则高阶位置为 0。
     
     
     
     
     bitset<n> b(s, pos, n);//b 是 s 中从位置 pos 开始的&nbps;n 个位的副
     string str("1111111000000011001101");
     bitset<32> bitvec5(str, 5, 4); // 4 bits starting at str[5], 1100
     
     位操作
     b.any() b 中是否存在置为 1 的二进制位?
     
     b.none() b 中不存在置为 1 的二进制位吗?
     
     
     b.count() b 中置为 1 的二进制位的个数
     
     
     b.size() b 中二进制位的个数
     
     
     b[pos] 访问 b 中在 pos 处二进制位
     
     
     b.test(pos) b 中在 pos 处的二进制位置为 1 么?
     
     
     b.set() 把 b 中所有二进制位都置为 1
      
     b.reset()            把所有二进制位设为0
     
     
     b.set(pos)      把 b 中在 pos 处的二进制位置为 1
     
     
     flip 操作可以对 bitset 对象的所有位或个别位取反:
     bitvec.flip(0);   // reverses value of first bit
     bitvec[0].flip(); // also reverses the first bit
     bitvec.flip();    // reverses value of all bits
     

    
    
    

     

  • 相关阅读:
    整数转字符串
    SharePoint介绍性文章
    Disable Sharepoint 2007 show as System Account when system admin login
    通过IP地址获得主机名
    从文本文件读取信息
    数据库连接池问题[转]
    企业类库问题 public key 问题[经过自己测试]
    Google Analytics异步代码创建虚拟浏览量跟踪
    同一主机上WordPress博客更换域名简易八步骤(2)
    关于application/xwwwformurlencoded等字符编码的解释说明
  • 原文地址:https://www.cnblogs.com/james1207/p/3313093.html
Copyright © 2020-2023  润新知