本文共 7452 字,大约阅读时间需要 24 分钟。
C++篇:基础入门
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() 成员函数似乎应该返回整形数值,或如 2.2 节“建议”中所述的无符号整数。但事实上,size 操作返回的是 string::size_type 类型的值。我们需要对这种类型做一些解释。string 类类型和许多其他库类型都定义了一些配套类型(companion type)。通过这些配套类型,库类型的使用就能与机器无关(machine-independent)。size_type 就是这些配套类型中的一种。它定义为与 unsigned 型(unsignedint 或 unsigned long)具有相同的含义,而且可以保证足够大能够存储任
意 string 对象的长度。为了使用由 string 类型定义的 size_type 类型是由 string 类定义。任何存储 string 的 size 操作结果的变量必须为 string::size_type 类型。特别重要的是,还要把 size 的返回值赋给一个 int 变量。虽然我们不知道 string::size_type 的确切类型,但可以知道它是 unsigned 型(2.1.1 节)。对于任意一种给定的数据类型,它的 unsigned 型所能表示的最大正数值比对应的 signed 型要大倍。这个事实表明 size_type 存储的 string 长度是 int 所能存储的两倍。120使用 int 变量的另一个问题是,有些机器上 int 变量的表示范围太小,甚至无法存储实际并不长的 string 对象。如在有 16 位 int 型的机器上,int 类型变量最大只能表示 32767 个字符的 string 个字符的 string 对象。而能容纳一个文件内容的 string 对象轻易就会超过这个数字。因此,为了避免溢出,保存一个 stirng 对象 size 的最安全的方法就是使用标准库类型 string::size_type
标准库 vector 类型
vector 是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。和 string 对象一样,标准库将负责管理与存储元素相关的内存。我们把 vector称为容器,是因为它可以包含其他对象。一个容器中的所有对象都必须是同一种类型的。我们将在第九章更详细地介绍容器。使用 vector 之前,必须包含相应的头文件。本书给出的例子,都是假设已作了相应的 using 声明:
#includeusing std::vector;
声明从类模板产生的某种类型的对象,需要提供附加信息,信息的种类取决于模板。以 vector 为例,必须说明 vector 保存何种对象的类型,通过将类型放在类型放在类模板名称后面的尖括号中来指定类型:
vector ivec;vectorSales_vec;
和其他变量定义一样,定义 vector 对象要指定类型和一个变量的列表。上面的第一个定义,类型是 vector,该类型即是含有若干 int 类型对象的vector,变量名为 ivec。第二个定义的变量名是 Sales_vec,它所保存的元素是 Sales_item 类型的对象。
vector 不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。vector 类型的每一种都指定了其保存元素的类型。因此,vector 和 vector 都是数据类型。
虽然可以对给定元素个数的 vector 对象预先分配内存,但更有效的方法是先初始化一个空 vector 对象,然后再动态地增加元素(我们随后将学习如何进行这样的操作)
迭代器简介
除了使用下标来访问 vector 对象的元素外,标准库还提供了另一种访问元素的方法:使用迭代器(iterator)。迭代器是一种检查容器内元素并遍历元素的数据类型。标准库为每一种标准容器(包括 vector)定义了一种迭代器类型。迭代器类型提供了比下标操作更通用化的方法:所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。因为迭代器对所有的容器都适用,现代 C++ 程序更倾向于使用迭代器而不是下标操作访问容器元素,即使对支持下标操作的 vector 类型也是这样。
每种容器类型都定义了自己的迭代器类型,如 vector:
vector ::iterator iter;这符语句定义了一个名为 iter 的变量,它的数据类型是 vector 定义的 iterator 类型。每个标准库容器类型都定义了一个名为 iterator 的成员,这里的 iterator 与迭代器实际类型的含义相同。
每种容器都定义了一对命名为 begin 和 end 的函数,用于返回迭代器。如果容器中有元素的话,由 begin 返回的迭代器指向第一个元素:
vector ::iterator iter = ivec.begin();上述语句把 iter 初始化为由名为 vector 操作返回的值。假设 vector 不空,初始化后,iter 即指该元素为 ivec[0]。
由 end 操作返回的迭代器指向 vector 的“末端元素的下一个”。“超出末端迭代器”(off-the-end iterator)。表明它指向了一个不存在的元素。如果 vector 为空,begin 返回的迭代器与 end 返回的迭代器相同。由 end 操作返回的迭代器并不指向 vector 中任何实际的元素,相反,它只是起一个哨兵(sentinel)的作用,表示我们已处理完 vector 中所有元素。
迭代器类型可使用解引用操作符(dereference operator)(*)来访问迭代器所指向的元素:
*iter = 0;
假设已声明了一个 vector 型的 ivec 变量,要把它所有元素值重置为 0,可以用下标操作来完成:
// reset all the elements in ivec to 0for (vector ::size_type ix = 0; ix != ivec.size(); ++ix)ivec[ix] = 0;上述程序用 for 循环遍历 ivec 的元素,for 循环定义了一个索引 ix ,每循环迭代一次 ix 就自增 1。for 循环体将 ivec 的每个元素赋值为 0。
更典型的做法是用迭代器来编写循环:
// equivalent loop using iterators to reset all the elements in ivecto 0for (vector ::iterator iter = ivec.begin();iter != ivec.end(); ++iter)*iter = 0; // set element to which iter refers to 0
前面的程序用 vector::iterator 改变 vector 中的元素值。每种容器类型还定义了一种名为 const_iterator 的类型,该类型只能用于读取容器内元素,但不能改变其值。例如,如果 text 是 vector 类型,程序员想要遍历它,输出每个元素,可以这样编写程序:
// use const_iterator because we won't change the elementsfor (vector::const_iterator iter = text.begin();iter != text.end(); ++iter)cout << *iter << endl; // print each element in text
标准库 bitset
有些程序要处理二进制位的有序集,每个位可能包含 0(关)1(开)值。位是用来保存一组项或条件的 yes/no 信息(有时也称标志)的简洁方法。标准库提供的 bitset 类简化了位集的处理。要使用 bitset 类就必须包含相关的头文件。在本书提供的例子中,假设都使用 std::bitset 的 using 声明:#includeusing std::bitset;
类似于 vector,bitset 类是一种类模板;而与 vector 不一样的是 bitset 类型对象的区别仅在其长度而不在其类型。在定义 bitset 时,要明确 bitset 含有多少位,须在尖括号内给出它的长度值:
bitset<32> bitvec; // 32 bits, all zero这条语句把 bitvec 定义为含有 32 个位的 bitset 对象。和 vector 的元素一样,bitset 中的位是没有命名的,程序员只能按位置来访问。位集合的位置编号从 0 开始,因此,bitvec 的位序是从 0 到 31。以 0 位开始的位串是低阶位(low-order),以 31 位结束的位串是高阶位(high-order)。
在 32 位 unsigned long 的机器上,十六进制值 0xffff 表示为二进制位就是十六个 1 和十六个 0(每个 0xf 可表示为 1111)。可以用 0xffff 初始化 bitset 对象:
// bitvec1 is smaller than the initializerbitset<16> bitvec1(0xffff);// bits 0 ... 15 are set to 1// bitvec2 same size as initializerbitset<32> bitvec2(0xffff);// bits 0 ... 15 are set to 1;16 ... 31 are 0// on a 32-bit machine, bits 0 to 31 initialized from 0xffffbitset<128> bitvec3(0xffff);// bits 32 through 127initialized to zero上面的三个例子中,0 到 15 位都置为 1。由于 bitvec1 位数少于 unsigned long 的位数,因此 bitvec1 的初始值的高阶被丢弃。bitvec2 和 unsigned long 长度相同,因此所有位正好放置了初始值。bitvec3 长度大于 32,31 位以上的高阶位就被置为 0。
C++基础小结
1.abstract data type(抽象数据类型) 隐藏其实现的数据类型。使用抽象数据类型时,只需要了解该类型所支持的操作。 2.bitset 一种标准库类型,用于保存位置,并提供地各个位的测试和置位操作。cctype header(cctype 头文件) 3.cctype header(cctype 头文件) 从 C 标准库继承而来的头文件,包含一组测试字符值的例程。 4.class template(类模板) 一个可创建许多潜在类类型的蓝图。使用类模板时,必须给出实际的类型和值。例如,vector 类型是保存给定类型对象的模板。创建一个 vector对象是,必须指出这个 vector 对象所保存的元素的类型。vector保存 int 的对象,而 vector 则保存 string 对象,以此类推。 5.container(容器) 一种类型,其对象保存一组给定类型的对象的集合。 6.difference_type 一种由 vector 类型定义的 signed 整型,用于存储任意两个迭代器间的距离。 7.empty 由 string 类型和 vector 类型定义的成员函数。empty 返回布尔值,用于检测 string 是否有字符或 vector 是否有元素。如果 string 或 vector的 size 为 0,则返回 true,否则返回 false。 8.getline string 头文件中定义的函数,该函数接受一个 istream 对象和一个 string对象,读取输入流直到下一个换行符,存储读入的输入流到 string 对象中,并返回 istream 对象。换行符被读入并丢弃。 9.high-order(高阶) bitset 对象中索引值最大的位。 10.index(索引) 下标操作符所使用的值,用于表示从 string 对象或 vector 对象中获取的元素。也称“下标”。 11.iterator(迭代器) 用于对容器类型的元素进行检查和遍历的数据类型。 12.iterator arithmetic(迭代器的算术操作) 应用于一些(并非全部)迭代器类型的算术操作。迭代器对象可以加上或减去一个整型数值,结果迭代器指向处于原迭代器之前或之后若干个元素的位置。两个迭代器对象可以相减,得到的结果是它们之间的距离。迭代器算术操作只适用于指向同一容器中的元素或指向容器末端的下一元素迭代器。 13.low-order(低阶) bitset 对象中索引值最小的位。 14.off-the-end iterator(超出末端的迭代器) 由 end 操作返回的迭代器,是一种指向容器末端之后的不存在元素的迭代器。 15.push_back 由 vector 类型定义的成员函数,用于把元素追加到 vector 对象的尾部。 16.sentinel(哨兵) 一种程序设计技术,使用一个值来控制处理过程。在本章中使用由 end操作返回的迭代器作为保护符,当处理完 vector 对象中的所有元素后,用它来停止处理 vector 中的元素。 17.size 由库类型 string、vector 和 bitset 定义的函数,分别用于返回此三个类型的字符个数、元素个素、二进制位的个数。string 和 vector 类的 size成员函数返回 size_type 类型的值(例如,string 对象的 size 操作返回string::size_type 类型值)。bitset 对象的 size 操作返回 size_t 类型值。 18.size_t 在 cstddef 头文件中定义的机器相关的无符号整型,该类型足以保存最大数组的长度。在 cstddef 头文件中定义的机器相关的无符号整型,该类型足以保存最大数组的长度。 19.size_type 由 string 类类型和 vector 类类型定义的类型,用以保存任意 string 对象或 vecotr 对象的长度。标准库类型将 size_type 定义为 unsigned 类型。 20.using declarations(using 声明) 使命名空间的名字可以直接引用。比如:using namespace::name;可以直接访问 name 而无须前缀 namespace::。 21.value initialization(值初始化) 当给定容器的长度,但没有显式提供元素的初始式时,对容器元素进行的初始化。元素被初始化为一个编译器产生的值的副本。如果容器保存内置类型变量,则元素的初始值将置为 0。如果容器用于保存类对象,则元素的初始值由类的默认构造函数产生。只有类提供了默认构造函数时,类类型的容器元素才能进行值初始化。 22.++ operator(++操作符) 迭代器类型定义的自增操作符,通过“加 1”移动迭代器指向下一个元素。 23.:: operator(::操作符) 作用域操作符。::操作符在其左操作数的作用域内找到其右操作数的名字。用于访问某个命名空间中的名字,如 std::cout,表明名字 cout 来自命名空间 std。同样地,可用来从某个类取名字,如 string::size_type,表明 size_type 是由 string 类定义的。 24.[] operator([]操作符) 由 string, vector 和 bitset 类型定义的重载操作符。它接受两个操作数:左操作数是对象名字,右操作数是一个索引。该操作符用于取出位置与索引相符的元素,索引计数从 0 开始,即第一个元素的索引为 0,最后一个元素的索引为 obj.size() -1。下标操作返回左值,因此可将下标操作作为赋值操作的左操作数。对下标操作的结果赋值是赋一个新值到相应的元素。 25.* operator(*操作符) 迭代器类型定义了解引用操作符来返回迭代器所指向的对象。解引用返回左值,因此可将解引用操作符用作赋值操作的左操作数。对解引用操作的结果赋值是赋一个新值到相应的元素。 26.<< operator(<< 操作符) 标准库类型 string 和 bitset 定义了输出操作符。string 类型的输出操作符将输出 string 对象中的字符。bitset 类型的输出操作符则输出bitset 对象的位模式。 27.>> operator(>> 操作符) 标准库类型 string 和 bitset 定义了输入操作符。string 类型的输入操作符读入以空白字符为分隔符的字符串,并把读入的内容存储在右操作数(string 对象)中。bitset 类型的输入操作符则读入一个位序列到其bitset 操作数中。转载地址:https://blog.csdn.net/zytgg123456/article/details/110795297 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!