标准库类型

简介: 一.标准string类型     string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作。 1.1 string对象的定义和初始化     当没有明确指定对象初始化时,系统将使用默认构造函数。

 

一.标准string类型

    string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作。

1.1 string对象的定义和初始化

    当没有明确指定对象初始化时,系统将使用默认构造函数。

   注意:编程时一定要注意区分字符串字面值string数据类型的使用。

1.2 string对象的读写

    1. string类型的输入操作符:

  • 读取并忽略开头所有的空白字符(如空格、换行符、制表符)。
  • 读取字符直至再次遇到空白字符,读取终止。

     2.读入未知书目的string对象:

    string word; 
  // read until end-of-file , writing each to a new line 
    while(cin >> word)  
          cout<<word<<endl;  

     3用getline读取整行文本:getline并不忽略行开头的换行符,遇到换行符则停止读入并返回。

    string line;//每次输出一行文本  
    while(getline(cin, line))  
         cout<<line<<endl;  

    4、string对象比较操作是区分大小写的,即同一个字符的大小写形式被认为是两个不同的字符。任何一个大写字母都小于任意的小写字母。

    5、string对象的下标从0开始,如果s是一个string对象且s不空,则s[0]就是字符串的第一个字符,s[1]就是第二个,s[s.size()-1]则是最后一个字符。

     6、标准库不要求检查索引值,所有索引的下标越界是没有定义的,会导致严重错误。
 
1.3  string对象的操作

    1. string对象的长度指的是string对象中字符的个数,可以通过size操作获取。如s.size() ,返回s中字符的个数。

        如何判断string对象是否为空:

方法一:
if
( st.size() == 0) // ok:empt
方法二:
    if(st.empty())
        // ok:empty

     empty()成员函数将返回bool值,如果string对象为空则返回true,否则返回false。

     2.string::size_type类型

     任何存储string的size操作结果的变量必须为string::size_type类型。特别重要的是,不要把size的返回值赋给一个int变量。

      string类类型和许多其他库类型都定义了一些配套类型。通过这些配套类型,库类型的使用就能与机器无关。size_type就是这些配套类型中的一种。它定义为unsigned型(unsigned int或unsigned long)具有相同的含义,而且可以保证足够大能够存储任意string对象的长度。

     3.string关系操作符

     string对象比较操作是区分大小写的,即同一个字符的大小写形式被认为是两个不同的字符。任何一个大写字母都小于任意的小写字母。

     两个string对象相等时指它们的长度相同,且含有相同的字符。

     关系操作符比较两个string对象时采用和(大小写敏感)字典排序相同的策略:

  • 如果两个string对象长度不同,且短的string对象与长的string对象的前面部分相匹配,则短的string对象小于长的string对象。
  • 如果两个string对象的字符不同,则比较第一个不匹配的字符。

     4.两个string对象相加

      string对象的加法被定义为连接。两个(或多个)string对象可通过加操作符+连接起来。

string s1("hello, ");
string s2("world\n");
string s3 = s1 + s2; // s3 is hello, world\n

     5.和字符串字面值的连接

      当进行string对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个事string类型的

      将两个字符串字面值相加,是非法的。

      6.string类型通过下标操作符([])来访问string对象中的单个字符,下标操作符需要一个size_type类型的值来表明要访问字符的位置。下标中的值被称为“下标”或“索引”。

      用下标操作符分别取出string对象的每个字符,分行输出:

string str("some string");
for(string::size_type ix = 0 ; ix != str.size() ; ++ix)
    cout<<str[ix]<<endl;

     应该用string::size_type类型的变量接收size函数的返回值。在定义用作索引的变量时,出于同样的道理,string对象的索引变量最好也用string::size_type类型。

    7.string对戏那个中字符的处理

   这些函数都在cctype头文件中定义。

1     string str="HELLO WORLD!!!";  
2     for(string::size_type index=0; index != str.size(); ++index)  
3              str[index] = tolower(str[index]);  
4     cout<<str<<endl;   //cout the lower  

 

二.标准库vector类型

    vector是一个类模板(class template),vector不是一种数据类型,可以用来定任意多种数据类型。vector类型的每一种都指定了其保存元素的类型。因此,vector<int>、vector<string>都是数据类型。

    vector也称为容器。一个容器中的所有对象都必须是同一种类型的。

    1、vector对象的定义和初始化:vector对象的重要属性就在于可以在运行时高效地添加元素,虽然可以在给定元素个数的vector对象预先分配内存,但更有效的方式是先初始化一个空的vector对象,然后再动态的增加元素

     

    2.vector对象的操作

    使用size_type类型时,必须指出该类型是在哪里定义的,vector类型总是包括vector的元素类型:

1     vector<int>::size_type    //ok  
2     vector::size_type            //error  

    3、下标操作不能添加元素:vector用push_back来添加元素

     初学C++的程序员可能会认为vector的下标操作可以添加元素,其实不然:

1 //以下代码是错误的
2 vector<int> ivec;   //empty vector
3 for(vector<int>::size_type ix = 0 ; ix != 10 ; ++ix)
4    ivec[ix] = ix ; // disaster: ivec has no elements

上述程序试图在ivec中插入10个新元素,元素值依次为0到9的整数。但是这里ivec是空的vector对象,而且下标只能用于获取已存在的元素

这个循环的正确写法应该是:

1     for(vector<int>::size_type ix=0; ix!=10; ++ix)  
2           ivec.push_back(ix);  

      必须是已存在的元素才能用下标操作符进行索引,通过下标操作进行赋值时,不会添加任何元素。仅能对确知已存在的元素进行下标操作,对于下标操作符仅能提取确实已存在的元素,

1 vector<int> ivec;            //empty vector  
2 cout<<ivec[0];              //Error:ivec has no elements       
3 vector<int> ivec2(20//vector with 20 elements  
4 cout<< ivec2[20];         //Error:elements 0....19 

     对不存在的元素进行下标操作时程序设计过程中经常会犯的错误。

     “缓冲区溢出”错误就是对不存在的元素进行下标操作的结果。

 

三. 迭代器简介

     除了使用下标来访问vector对象的元素外,标准库还提供了另一种访问元素的方法:使用迭代器。迭代器是一种检查容器内元素并遍历元素的数据类型

     迭代器对所有的容器都实用。每种容器都定义了自己的迭代器类型。如vector:

1     vector<int>::iterator iter;  

     这条语句定义了一个名为iter的变量,它的数据类型是由vector<int>定义的iterator类型。每个标准库容器类型都定义了一个名为iterator的成员,这里的iterator与迭代器实际类型的含义相同。

     iterator往往表示两个不同的事物:一般意义上指的是迭代器的概念;而具体而言时指的则是由容器定义的具体的iterator类型,如vector<int>。

    1、begin和end操作:用于返回迭代器。如果有元素begin返回迭代器指向第一个元素,end返回迭代器指向vector的”末端的下一个“指向一个不存在的元素:

vector<int>::iterator iter = ivec.begin(); 

      上述语句把iter初始化为由名为begin的vector操作返回的值。假设vector不空,初始化后,iter即指该元素为ivec[0].

       由end操作返回的迭代器并不指向vector中任何实际的元素,相反,他只是起一个哨兵(sentinel)的作用,表示已处理完vector中所有元素。

    2. 迭代器应用的程序实例

      假设已声明一个vector<int>型的ivec变量,要把所有元素值重置为0.

 使用下标操作来完成

1 // reset all the elements in ivec to 0
2 for(vector<int>::size_type ix = 0 ; ix != ivec.size() ; ++ix)
3      ivec[ix] = 0;

更典型的做法是使用迭代器来编写循环

1 //equivalent loop using iterators to reset all the elements in ivec to 0
2 for(vector<int>::iterator iter = ivec.begin() ; iter != ivec.end() ; ++iter)
3      *iter = 0 ; // set element to which iter refers to 0

    3、const_iterator:只能用于读取容器内元素,但不能改变其值。

      不要将const_iterator对象与const的iterator对象混淆起来,声明一个const迭代器时,必须初始化迭代器,一旦初始化后,就不能改变它的值。

1     vector<int> nums(10);  
2     const vecotr<int>::iterator cit = nums.begin();  
3     *cit = 1;     //ok  
4      ++cit;         //Erorr  

  

1 // an iterator that cannot write elements
2 vector<int>::const_iterator
3 // an iterator whose value cannot change
4 const vector<int>::iterator

    const_iterator:只能用于读取容器内元素,但不能改变其值。使用const_iterator类型时,我们可以得到一个迭代器,它自身的值可以改变,但不能用来改变其所指向的元素的值。可以对迭代器进行自增以及使用解引用操作符来读取值,但不能对该元素值赋值。

    const迭代器这种类型几乎没什么用处:一旦它被初始化后,只能用它来改写其指向的元素,但不能使它指向任何其他元素。

 

四。标准库bitset类型

   bitset类是一种类模板。bitset类型对象的区别仅在其长度而不在其类型。在定义bitset时,要明确bitset含有多少位,需在尖括号内给出他的长度值:

bitset<32> bitvec;  // 32 bits , all zero

   给出的长度值必须是常量表达式。正如这里给出的,长度值必须定义为整型字面值常量或是已用常量值初始化的整形的const对象。

  1、用unsigned值初始化bitset对象:該值将转换成二进制的位模式,如果bitset类型长度打印unsigned long值的二进制位数,其余的高阶位将置为0,而小于则只用unsigned值中的低阶位,将超过的高阶位丢弃。

   2、用string对象初始化bitset对象:string对象直接表示为 位模式string对象和bitset对象之间是反向转化的,string对象的最右边字符用来初始化bitset对象的低阶位。
     
        从string对象读入位集的顺序是 从右向左
1 string strval("1100");
2 bitset<32> bitvec(strval);

      bitvec的位模式中第2和3的位置为1,其余位置都为0.如果string对象的字符个数小于bitset类型的长度,则高阶位将置为0.

      string对象和bitset对象之间是反向转化string对象的最右边字符(即下标最大的那个字符)用来初始化bitset对象的低阶位(即下标为0的位)。当用string对象初始化bitset对象时,记住这一差别很重要。

1 string str("111111100000010101");
2 bitset<32> bitvec1(str , 5 , 4);  // 4 bits starting at str[5] , 1100
3 bitset<32> bitvec2(str , str.size() - 4); // use last 4 characters

 

  3、bitset对象的操作
 
 
      
1 bitset<32> bitvec;   // 32 bits , all zero
2 size_t bits_set = bitvec.count(); //置为1的二进制位的个数
3 size_t sz = bitvec.size(); // return 32

       count操作的返回类型时标准库中命为size_t的类型。size_t类型定义在cstddef头文件中。他是一个与机器相关的unsigned类型,大小足以保证存储内存中对象的大小。

   4.访问bitset对象中的位

    

// assign 1 to even numbered bits
for(int index = 0 ; index != 32 ; index += 2)
    bitvec[index] = 1;

   为了测试某个二进制位是否为1,可以用test操作或者测试下标操作符的返回值:

1 if(bitvec.test(i))
2     //bitvec[i] is on
3 
4 // equivalent test using subscript
5 if(bitvec[i])
6     //bitvec[i] is on

      如果下标操作符测试的二进制位为1,则返回的测试值的结果为true,否则返回false。

1 bitvec.reset();  // set all the bits to 0
2 bitvec.set();     // set all the bits to 1

 


微信公众号: 猿人谷
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎关注微信公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

目录
相关文章
|
6月前
|
存储 算法 C++
C++的常用标准库
C++的常用标准库docx
68 1
|
6月前
|
Java Unix 程序员
C标准库
C标准库
53 1
|
6月前
|
算法 程序员 C++
|
22天前
|
Go
go语言常量的类型
【10月更文挑战第20天】
23 2
|
1月前
|
机器学习/深度学习 XML TensorFlow
标准库
【10月更文挑战第09天】
17 1
|
2月前
|
存储 编译器 Serverless
C 标准库 - <stdarg.h>详解
`&lt;stdarg.h&gt;` 是 C 标准库中的头文件,提供了处理可变参数函数(varargs)的机制,允许开发者定义接受任意数量参数的函数。它定义了三个主要宏:`va_start`、`va_arg` 和 `va_end`,用于初始化、访问和清理可变参数列表。
|
2月前
|
安全 C语言
C 标准库 - <stddef.h>详解
`&lt;stddef.h&gt;` 是 C 标准库的一个头文件,定义了常用类型和宏,包括 `size_t`(表示对象大小)、`ptrdiff_t`(指针间差值)、`NULL`(空指针)和 `offsetof`(计算结构体成员偏移量)。
|
2月前
阅标准库
阅标准库。
41 7
|
2月前
|
C语言 开发者
C 标准库
C 标准库是 C 语言的核心组成部分,提供了丰富的函数和宏,帮助开发者轻松完成常见任务。
|
3月前
|
C++
C++标准库探索
C++标准库探索
40 0
下一篇
无影云桌面