《C++Primer》 第三章 标准库类型

本文详细介绍了C++标准库中的几种重要数据类型,包括string、vector和bitset的使用方法及特性。探讨了这些类型的基本操作、初始化方式以及迭代器的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

除低级数据类型,C++标准库还定义了许多更高级的抽象数据类型(abstract data type),比如string,vector,bitset。

命名空间的using声明
使用using声明可以在不需要加前缀namespace_name::的情况下访问命名空间中的名字。
using  namespace::name;
一个using声明一次只能作用于一个命名空间成员。
如:
using  std::cin;
using  std::cout;
using  std::enl;

标准库string类型
#include<string>
using std::string;
string标准库支持几个构造函数,如:
string s1;            //陌生人构造函数,s1为空串
string s2(s1);        //将s2初始化为s1的一个副本
string s3("value");    //将s3初始化为一个字符串字面值副本
string s4(n,'c');    //将s4初始化为字符'c'的n个副本

因为历史原因及为了与C语言兼容,字符串字面值(比如:“value”)与标准库string类型不是同一类型@!!

string对象的读写
1、用cin
cin >> s;
string类型的输入操作符:
读取并忽略开头所有空白字符(如空格,换行,制表)
读取字符直到再次遇到空白字符,读取终止。
2、用getline
从输入流的下一行读取,并保存读取的内容到string中,但不包括换行符。!!并不忽略行开头的换行符!!如果第一个字符就是换行符,则string被指为空string。
遇到空格不会停止,会把空格记录下来。

string对象的操作
s.empty()
s.size()
s[n]
s1 + s2(s3 = s1 + s2; s1 += s2; s3 = s1 + "," + s2 + "/n";)
s1 = s2
v1 == v2
!= , < , <= , > , >=同上

当进行string对象和字符串字面值混合连接操作时,+ 操作符的左右操作数必须至少有一个是string类型的:
string s1 = "hello";                //ok
string s2 = "world";                //ok
string s3 = s1 + ", ";                //ok
string s4 = "hello" + ", ";            //error
string s5 = s1 + ", " + "world";    //ok
string s6 = "hello" + ", " + s2;    //error

s1[0]第一个字符
s[s.size() - 1]最后一个字符
任何可产生整型值的表达式都可用作下标操作符的索引。

string::size_type

string对象中字符的处理,在cctype头文件中定义:p77

标准库vector类型
容器,包含#include<vector>,using std::vector;
vector<int> ivec;
vector<Sales_item> Sales_vec;
vector不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。

几种初始化vector对象的方式

迭代器(iterator),各种容器都定义了自己的iterator类型,可替代下标操作
vector<int>::iterator iter;
begin和end操作。

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

const_iterator,指向const对象的引用,它自身的值可以改变,但不能用来改变其所指向的元素的值(只读取容器内元素(不能改变))。

不要把const_iterator对象和const的iterator对象混淆。
const_iterator对象可用于const vector 或非const vector,而const迭代器几乎没用。

迭代器的算术操作:
iter + n
iter - n    //加减的类型应该是vector的size_type或difference_type类型
iter1 + iter2
定位于vector的中间元素:
    vector<int>::iterator mid = vi.begin() + vi.size() / 2;        //效率比逐个自增要高
    vector<int>::iterator mid = ( vi.begin() + vi.size() ) /2;    //错误的,因为( vi.begin() + vi.size() ) /2返回的是difference_type的signed类型,而mid是iterator类型
   
标准库bitset类型
#include <bitset>
using std::bitset;

与vector不一样的是bitset类型对象的区别仅在其长度而不在于其类型。
bitset<32> bitvec;   //32 bits,all zero
给出的长度值必须是常量表达式,长度值必须定义为整型字面值常量或是已用常量值初始化的整型的const对象。
初始化bitset对象的方法 :p88
bitset<n> b;
bitset<n> b(u);
bitset<n> b(s);
bitset<n> b(s,pos,n);   
用unsigned值初始化bitset对象   
用string对象初始化bitset对象,注意读入位集是从右向左!!可以只用某个子串作为初始值;    //p89
注意用某个子串初始化时,pos也是从右开始计算的。

bitset对象上的操作        //p90

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值