第三章

几种初始化 string 对象的方式

string s1;  默认构造函数 s1 为空串

string s2(s1);  将 s2 初始化为 s1 的一个副本

string s3("value");  将 s3 初始化为一个字符串字面值副本

string s4(n, 'c'); 将 s4 初始化为字符 'c' 的 n 个副本

 

警告:标准库 string 类型和字符串字面值

因为历史原因以及为了与 C 语言兼容,字符串字面值 与 标准 库 string 类型不是同一种类型。这一点很容易引起混乱,编程时一定 要注意区分字符串字面值和 string 数据类型的使用,这很重要。

 

和内置类型的输入操作一样,string 的输入操作符也会返回所读的数据流

使用 getline 读取整行文本

getline(cin, string)这个函数接受两个参数: 一个输入流对象和一个 string 对象。getline 函数从输入流的下一行读取,并 保存读取的内容到不包括换行符。和输入操作符不一样的是,getline 并不忽略 行开头的换行符。只要 getline 遇到换行符,即便它是输入的第一个字符, getline 也将停止读入并返回。如果第一个字符就是换行符,则 string 参数将 被置为空 string。

例如:

string line;
while (getline(cin, line)) // read line at time until end-of-file
  cout << line << endl; 

由于 getline 函数返回时丢弃换行符,换行符将不会存储 在 string 对象中。

string 对象的操作

s.empty()  如果 s 为空串,则返回 true,否则返回 false。

s.size() 返回 s 中字符的个数

s[n]  返回 s 中位置为 n 的字符,位置从 0 开始计数

s1 + s2 把 s1 和 s2 连接成一个新字符串,返回新生成的字符串

s1 = s2 把 s1 内容替换为 s2 的副本

v1 == v2 比较 v1 与 v2 的内容,相等则返回 true,否则返 回 false

!=, <, <=,>,and >=  保持这些操作符惯有的含义

string::size_type 类型

实际上size()函数返回的不是int类型的数,而是string::size_type类型的值,是一种unsigned的,比int类型表示的数大一倍

任何存储 string 的 size 操作结果的变量必须 为 string::size_type 类型。特别重要的是,还要 把 size 的返回值赋给一个 int 变量。这样可以克服不同机器之间的影响。

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

string 对象的赋值

string s1;

s1 = s2;

它必须先把 st1 占 用的相关内存释放掉,然后再分配给 st2 足够存放 st2 副本的内存空间,最后 把 st2 中的所有字符复制到新分配的内存空间。

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

 

虽然任何整型数值都可作为下标索引,但索引的实际数据类型却是类 型 unsigned 类型 string::size_type。

c++中对string中单个字符的处理的函数库为cctype

isalnum(c) 如果 c 是字母或数字,则为 True。

isalpha(c) 如果 c 是字母,则为 true。

iscntrl(c) 如果 c 是控制字符,则为 true

isdigit(c) 如果 c 是数字,则为 true。

isgraph(c) 如果 c 不是空格,但可打印,则为 true。

islower(c) 如果 c 是小写字母,则为 true。

isprint(c) 如果 c 是可打印的字符,则为 true。

ispunct(c) 如果 c 是标点符号,则 true。

isspace(c) 如果 c 是空白字符,则为 true。

isupper(c) 如果 c 是大写字母,则 true。

isxdigit(c) 如果是 c 十六进制数,则为 true。

tolower(c) 如果 c 大写字母,返回其小写字母形式,否则直接返回 c。

toupper(c) 如果 c 是小写字母,则返回其大写字母形式,否则直接返回 c

tolower(c) 把string中字符变成小写字符

toupper(c)把string中字符变成大写字符

vector 不是一种数据类型,而只是一个类模板,可用来定义任 意多种数据类型。vector 类型的每一种都指定了其保存元素的 类型。

vector如果没有定义的时候就进行初始化,是int就初始化0.是string 就是空,类类型就是调用构造函数

元素类型可能是没有定义任何构造函数的类类型。这种 情况下,标准库仍产生一个带初始值的对象,这个对象的每个成员进行了值初始 化。

vector 操作

v.empty() 如果 v 为空,则返回 true,否则返回 false。

v.size() 返回 v 中元素的个数。

v.push_back(t) 在 v 的末尾增加一个值为 t 的元素。

v[n] 返回 v 中位置为 n 的元素。

v1 = v2 把 v1 的元素替换为 v2 中元素的副本。

v1 == v2 如果 v1 与 v2 相等,则返回 true。

!=, <, <=,>, and >=保持这些操作符惯有的含义。

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

vector::size_type // ok

vector::size_type // error

vector下标操作不添加元素

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

仅能对确知已存在的元素进行下标操作

每种容器都定义了一对命名为 begin 和 end 的函数,用于返回迭代器。如 果容器中有元素的话,由 begin 返回的迭代器指向第一个元素:

由 end 操作返回的迭代器指向 vector 的“末端元素的下一个”。“超出 末端迭代器”(off-the-end iterator)。表明它指向了一个不存在的元素。 如果 vector 为空,begin 返回的迭代器与 end 返回的迭代器相同。

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

迭代器类型可使用解引用操作符(dereference operator)(*)来访问迭 代器所指向的元素:

迭代器类型可使用解引用操作符(dereference operator)(*)来访问迭 代器所指向的元素:

如果两个迭代器对象指向同一个元素,则它们相等,否则就不相等。

 

const_iterator

该类型只能用于读取容器内元素, 但不能改变其值。

当我们对普通 iterator 类型解引用时,得到对某个元素的非 const 。而如果我们对 const_iterator 类型解引用时,则可以得到一个指 向 const 对象的引用,如同任何常量一样,该对象不能进行重写。

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

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

const_iterator 表示指向的对象无法被改变,const 的iterator表示不能改变指向的对象。

迭代器的算术操作

iter + n      iter - n

可以对迭代器对象加上或减去一个整形值。这样做将产生一个新的迭代 器,其位置在 iter 所指元素之前(加)或之后(减) n 个元素的位置。 加或减之后的结果必须指向 iter 所指 vector 中的某个元素,或者 是 vector 末端的后一个元素。加上或减去的值的类型应该 是 vector 的 size_type 或 difference_type 类型

iter1 - iter2

该表达式用来计算两个迭代器对象的距离,该距离是名 为 difference_type 的 signed 类型 size_type 的值,这里 的 difference_type 是 signed 类型

bitset 对象的定义和初始化

在定义 bitset 时,要明确 bitset 含有多少位,须在尖括号内给出它的长 度值

bitset<n> b; b 有 n 位,每位都 0

bitsetb<n> b(u); b 是 unsigned long 型 u 的一个副本

bitset<n> b(s); b 是 string 对象 s 中含有的位串的副本

bitset<n> b(s, pos, n); b 是 s 中从位置 pos 开始的&nbps;n 个位的副 本。

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

当用 unsigned long 值作为 bitset 对象的初始值时,该值将转化为二进 制的位模式。而 bitset 对象中的位集作为这种位模式的副本。如果 bitset 类 型长度大于 unsigned long 值的二进制位数,则其余的高阶位将置为 0;如 果 bitset 类型长度小于 unsigned long 值的二进制位数,则只使 用 unsigned 值中的低阶位,超过 bistset 类型长度的高阶位将被丢弃

string 对象初始化 bitset 对象

当用 string 对象初始化 bitset 对象时,string 对象直接表示为位模式。 从 string 对象读入位集的顺序是从右向左(from right to left): string strval("1100"); bitset bitvec4(strval); bitvec4 的位模式中第 2 和 3 的位置为 1,其余位置都为 0。如果 string 对 象的字符个数小于 bitset 类型的长度,则高阶位置为 0。 string 对象和 bitsets 对象之间是反向转化的:string 对象 的最右边字符(即下标最大的那个字符)用来初始化 bitset 对 象的低阶位(即下标为 0 的位)。当用 string 对象初始 化 bitset 对象时,记住这一差别很重要。

不一定要把整个 string 对象都作为 bitset 对象的初始值。相反,可以只 用某个子串作为初始值:

string str("1111111000000011001101");

bitset bitvec5(str, 5, 4); // 4 bits starting at str[5], 1100

bitset bitvec6(str, str.size() - 4); // use last 4 characters

bitset 操作

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.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 流

如果 bitset 对象中有一个或几个二进制位置为 1,则 any 操作返 回 true

如果 bitset 对象中二进制位全 为 0,则 none 操作返回 true。

如果需要知道置为 1 的二进制位的个数,可以使用 count 操作,该操作返 回置为 1 的二进制位的个数:

size_t bits_set = bitvec.count(); // returns number of bits that are on

count 操作的返回类型是标准库中命名为 size_t 类型。size_t 类型定义 在 cstddef 头文件中, size_t是unsigned

to_ulong 操作返回一个 unsigned long 值,该值与 bitset 对象的位模式 存储值相同。仅当 bitset 类型的长度小于或等于 unsigned long 的长度时, 才可以使用 to_ulong 操作

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值