- 浏览: 34919 次
- 性别:
- 来自: 南京
string 类型支持长度可变的字符串,C++ 标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作。
#include <string>
using std::string;
字符串字面值与标准库 string 类型不是同一种类型。
用 iostream 和 string 标准库,使用标准输入输出操作符来读写 string 对象
读取并忽略开头所有的空白字符(如空格,换行符,制表符)。
读取字符直至再次遇到空白字符,读取终止。
读入未知数目的 string 对象
使用 getline 读取整行文本
getline 函数从输入流的下一行读取,并保存读取的内容到不包括换行符。和输入操作符不一样的是,getline 并不忽略行开头的换行符。只要 getline 遇到换行符,即便它是输入的第一个字符,getline 也将停止读入并返回。如果第一个字符就是换行符,则 string 参数将被置为空 string。由于 line 不含换行符,若要逐行输出需要自行添加。
#include <iostream> #include <string> using namespace std; int main() { string word; // read until end-of-file, writing each word to a new line while (cin >> word) { cout << word << endl; } string line; // read line at time until end-of-file while (getline(cin, line)) { cout << line << endl; } return 0; }
关于size_type:
string 类类型和许多其他库类型都定义了一些配套类型(companion type)。通过这些配套类型,库类型的使用就能与机器无关(machine-independent)。size_type 就是这些配套类型中的一种。它定义为与 unsigned 型(unsigned int 或 unsigned long)具有相同的含义,而且可以保证足够大能够存储任意 string 对象的长度。
string 关系操作符
关系操作符比较两个 string 对象时采用了和(大小写敏感的)字典排序相同的策略
如果两个 string 对象长度不同,且短的 string 对象与长的 string 对象的前面部分相匹配,则短的 string 对象小于长的 string 对象。
如果 string 对象的字符不同,则比较第一个不匹配的字符
两个 string 对象相加
string 对象的加法被定义为连接(concatenation)。也就是说,两个(或多个)string 对象可以通过使用加操作符 + 或者复合赋值操作符 +=连接起来。
string和字符串字面值的连接
当进行 string 对象和字符串字面值混合连接操作时,+ 操作符的左右操作数必须至少有一个是 string 类型的
从 string 对象获取字符
string 类型通过下标操作符([ ])来访问 string 对象中的单个字符。下标操作符需要取一个 size_type 类型的值,来标明要访问字符的位置。
string 对象的下标从 0 开始。如果 s 是一个 string 对象且 s 不空,则 s[0] 就是字符串的第一个字符, s[1] 就表示第二个字符(如果有的话),而 s[s.size() - 1] 则表示 s 的最后一个字符。
引用下标时如果超出下标作用范围就会引起溢出错误。
下标操作可用作左值
#include <iostream> #include <string> using namespace std; int main() { string s1 = "hello"; // no punctuation string s2 = "world"; string s3 = s1 + ", "; // ok: adding a string and a literal //string s4 = "hello" + ", "; error: no string operand string s5 = s1 + ", " + "world"; // ok: each + has string operand //string s6 = "hello" + ", " + s2; error: can't add string literals for (string::size_type ix = 0; ix != s5.size(); ++ix) { cout << s5[ix]; } cout << endl; for (string::size_type ix = 0; ix != s5.size(); ++ix) { s5[ix] = '*'; } return 0; }
#include <iostream> #include <string> #include <cctype> using namespace std; int main() { string line; getline(cin,line); int alpha = 0; int digit = 0; int punct = 0; int space = 0; for(string::size_type index=0; index != line.size(); ++index) { if(isalpha(line[index])) { ++alpha; } if(isdigit(line[index])) { ++digit; } if(ispunct(line[index])) { ++punct; } if(isspace(line[index])) { ++space; } } cout << "alpha : " << alpha << endl; cout << "digit : " << digit << endl; cout << "punct : " << punct << endl; cout << "space : " << space << endl; return 0; }
vector 是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。和 string 对象一样,标准库将负责管理与存储元素相关的内存。
一个容器中的所有对象都必须是同一种类型的。
#include <vector>
using std::vector;
vector 不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。vector 类型的每一种都指定了其保存元素的类型。因此,vector<int> 和 vector<string> 都是数据类型。
虽然可以对给定元素个数的 vector 对象预先分配内存,但更有效的方法是先初始化一个空 vector 对象,然后再动态地增加元素.
如果没有指定元素的初始化式,那么标准库将自行提供一个元素初始值进行值初始化,具体值为何,取决于存储在 vector 中元素的数据类型
使用 size_type 类型时,必须指出该类型是在哪里定义的。vector 类型总是包括 vector 的元素类型:
向 vector 添加元素
vector 的下标操作类似于 string 类型的下标操作,vector 下标操作的结果为左值
下标操作不添加元素
下标只能用于获取已存在的元素。
必须是已存在的元素才能用下标操作符进行索引。通过下标操作进行赋值时,不会添加任何元素。
#include <iostream> #include <vector> using namespace std; int main() { vector<int> ivec; // empty vector // vector::size_type index; error! for (vector<int>::size_type ix = 0; ix != 10; ++ix) { // ivec[ix] = ix; disaster: ivec has no elements ivec.push_back(ix); //ok } for (vector<int>::size_type ix = 0; ix != 10; ++ix) { cout << ivec[ix] << endl; } system("pause"); return 0; }
迭代器
迭代器(iterator)迭代器是一种检查容器内元素并遍历元素的数据类型。
所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作
每种容器类型都定义了自己的迭代器类型,如 vector:
vector<int>::iterator iter;
如果容器中有元素的话,由 begin 返回的迭代器指向第一个元素
由 end 操作返回的迭代器指向 vector 的“末端元素的下一个”。
如果 vector 为空,begin 返回的迭代器与 end 返回的迭代器相同
由 end 操作返回的迭代器并不指向 vector 中任何实际的元素,相反,它只是起一个哨兵(sentinel)的作用,表示我们已处理完 vector 中所有元素。
代器类型可使用解引用操作符(dereference operator)(*)来访问迭代器所指向的元素
代器类支持自增和自减操作
由于 end 操作返回的迭代器不指向任何元素,因此不能对它进行解引用或自增操作。(指向不确定数据)
用 == 或 != 操作符来比较两个迭代器,如果两个迭代器对象指向同一个元素,则它们相等,否则就不相等。
每种容器类型还定义了一种名为 const_iterator 的类型,该类型只能用于读取容器内元素,但不能改变其值。
它自身的值可以改变,但不能用来改变其所指向的元素的值。
不要把 const_iterator 对象与 const 的 iterator 对象混淆起来。声明一个 const 迭代器时,必须初始化迭代器。一旦被初始化后,就不能改变它的值:
迭代器的算术操作
iter + n
iter - n
其位置在 iter 所指元素之前(加)或之后(减) n 个元素的位置。
iter1 - iter2
该表达式用来计算两个迭代器对象的距离,该距离是名为 difference_type 的 signed 类型 size_type 的值
iter1 与 iter2 两者必须都指向同一 vector 中的元素,或者指向 vector 末端之后的下一个元素。
下面语句直接定位于 vector 中间元素:
任何改变 vector 长度的操作都会使已存在的迭代器失效。例如,在调用 push_back 之后,就不能再信赖指向 vector 的迭代器的值了
#include <iostream> #include <vector> using namespace std; int main() { vector<int> ivec1; for(int i=0; i<10; ++i) { ivec1.push_back(i+10); } for(vector<int>::iterator iter=ivec1.begin(); iter!=ivec1.end(); ++iter) { cout << *iter << " "; } cout << endl; vector<int> ivec2(10,9); cout << "ivec1 == ivec2 ? " << boolalpha << (ivec1 == ivec2) << endl; vector<int>::iterator mid = ivec1.begin() + ivec1.size() / 2; cout << "*(mid-2) = " << *(mid-2) << endl; cout << "*(mid+2) = " << *(mid+2) << endl; vector<int>::iterator iterBeg = ivec1.begin(); cout << "*iterBeg = " << *iterBeg << endl; //print the first number vector<int>::iterator iterEnd = ivec1.end(); cout << "*iterEnd = " << *iterEnd << endl; //will print a random number cout << "iterEnd - iterBeg = " << (iterEnd - iterBeg) << endl; for (vector<int>::const_iterator iter = ivec1.begin(); iter != ivec1.end(); ++ iter) { // *iter = 1; error: *iter is const cout << *iter << " "; //readonly } cout << endl; vector<int> nums(10); // nums is nonconst const vector<int>::iterator cit = nums.begin(); *cit = 1; // ok: cit can change its underlying element //++cit; error: can't change the value of cit vector<int> vi; vi.push_back(4); vi.push_back(5); vi.push_back(6); vi.push_back(7); vector<int>::iterator iter = vi.begin(); cout << *(iter+1) << endl; cout << *(iter+2) << endl; cout << *(iter+3) << endl; vi.push_back(8); cout << *(iter+1) << endl; cout << *(iter+2) << endl; cout << *(iter+3) << endl; cout << *(iter+4) << endl; //will print 8? return 0; }
标准库提供的 bitset 类简化了位集的处理
#include <bitset>
using std::bitset;
按位置来访问,以 0 位开始的位串是低阶位(low-order),以 31 位结束的位串是高阶位(high-order)。
当用 unsigned long 值作为 bitset 对象的初始值时,该值将转化为二进制的位模式。
当用 string 对象初始化 bitset 对象时,string 对象直接表示为位模式。
size_t 类型定义在 cstddef 头文件中,该文件是 C 标准库的头文件 stddef.h 的 C++ 版本。它是一个与机器相关的 unsigned 类型,其大小足以保证存储内在中对象的大小。
可以用下标操作符来读或写某个索引位置的二进制位,
除了用下标操作符,还可以用 set;、test 和 reset 操作来测试或设置给定二进制位的值
#include <iostream> #include <string> #include <bitset> using namespace std; int main() { bitset<8> bs; cout << "bitset<8> : " << bs << endl; // bitvec1 is smaller than the initializer // bits 0 ... 15 are set to 1 bitset<16> bitvec1(0xffff); cout << "bitvec1 : " << bitvec1 << endl; // bitvec2 same size as initializer // bits 0 ... 15 are set to 1; 16 ... 31 are 0 bitset<32> bitvec2(0xffff); cout << "bitvec2 : " << bitvec2 << endl; // on a 32-bit machine, bits 0 to 31 initialized from 0xffff // bits 32 through 127 initialized to zero bitset<64> bitvec3(0xffff); cout << "bitvec3 : " << bitvec3 << endl; unsigned long ulong = bitvec3.to_ulong(); cout << "bitvec3.to_ulong() = " << ulong << endl; string strval("1100"); bitset<32> bitvec4(strval); cout << "bitvec4 : " << bitvec4 << endl; string str("1111111000000011001101"); bitset<32> bitvec5(str, 5, 4); // 4 bits starting at str[5], 1100 cout << "bitvec5 : " << bitvec5 << endl; bitset<32> bitvec6(str, str.size() - 4); // use last 4 characters cout << "bitvec6 : " << bitvec6 << endl; bitset<32> bitvec7; // 32 bits, all zero bool is_set = bitvec7.any(); // false, all bits are zero cout << "is_set : " << boolalpha << is_set << endl; bool is_not_set = bitvec7.none(); // true, all bits are zero cout << "is_not_set : " << boolalpha << is_not_set << endl; size_t bits_set = bitvec7.count(); // returns number of bits that are on cout << "bits_set : " << bits_set << endl; bitset<8> bitvec(strval); // 00001100 cout << boolalpha << "bitvec.test(0) : " << bitvec.test(0) << endl; cout << boolalpha << "bitvec.test(2) : " << bitvec.test(2) << endl; bitvec.set(6); // set all the bits to 0. cout << "after bitvec.set(6) : " << bitvec << endl; bitvec.reset(3); // set all the bits to 0. cout << "after bitvec.reset(3) : " << bitvec << endl; bitvec.reset(); // set all the bits to 0. cout << "after reset : " << bitvec << endl; bitvec.set(); // set all the bits to 1 cout << "after set : " << bitvec << endl; bitvec.flip(0); // reverses value of first bit cout << "after bitvec.flip(0) : " << bitvec << endl; bitvec[0].flip(); // also reverses the first bit cout << "after bitvec[0].flip() : " << bitvec << endl; bitvec.flip(); // reverses value of all bits cout << "after bitvec.flip() : " << bitvec << endl; return 0; }
发表评论
-
析构函数 管理指针成员
2008-02-23 20:10 4409析构函数就是这样的一个特殊函数,它可以完成所需的资源回收,作为 ... -
复制构造函数
2008-02-19 00:36 5257只有单个形参,而且该形参是对本类类型对象的引用(常用 cons ... -
友元 static 类成员
2008-02-17 21:09 4563友元机制允许一个类将 ... -
名字查找 构造函数 explicit
2008-02-16 20:50 4029每个类都定义了自己的 ... -
成员函数 this指针 可变数据成员
2008-02-16 00:11 4148类的成员函数可以访问 ... -
类class(一)
2008-02-14 23:30 3604最简单地说,类就是定义了一个新的类型和一个新作用域每个类可以没 ... -
输入输出IO
2008-02-12 22:00 4220每一个 IO 头文件都定义了 char 和 wchar_t 类 ... -
函数function
2008-02-12 21:57 3449函数由函数名以及一组操作数类型唯一地表示。函数的操作数,也即形 ... -
语句(...)
2008-02-12 21:55 4220简单语句C++ 中,大多数 ... -
表达式
2008-02-12 21:52 3229表达式由一个或多个操 ... -
数组和指针
2008-02-12 21:48 5173数组是由类型名、标识符和维数组成的复合数据类型数组也是一种存储 ... -
变量和基本类型
2008-02-12 21:12 3980类型是所有程序的基础,类型告诉我们数据代表什么意思以及可以对数 ... -
Hello world续
2008-02-04 00:15 2923/*the first C++ program*/ #inc ... -
经典再现 Hello world
2008-02-03 01:54 3809语言:ANSI C++,即标准C++编译和运行环境:红旗 Re ...
相关推荐
标准库是C语言的核心,提供了丰富的函数和数据类型,为程序员提供了与操作系统交互、处理基本数据类型、输入输出、内存管理等能力。下面将详细介绍其中包含的主要内容: 1. **C标准库中文版与英文版**: - `The C ...
4. 数据类型和变量:文档可能详细说明了如何使用标准库定义和操作各种数据类型,包括基本类型(如int、float、char)和派生类型(如数组、结构体、指针)。 5. 内存分配和管理:标准库中的动态内存分配函数(如...
C++标准库介绍 C++标准库是C++语言的核心组成部分之一,它提供了广泛的函数和类,用于实现输入/输出、字符串操作、容器、算法、诊断、语言支持等功能。C++标准库的头文件共有50个,其中18个提供了C库的功能。 C++...
C++标准库是C++语言的一部分,提供了诸多功能,用以支持不同的数据结构、算法和各种功能。本篇文档参考内容涵盖了C++标准库中各个组件的细节,包括但不限于:算法、分配器、容器、迭代器、函数对象、时间库、文件...
根据提供的文件信息,我们可以深入探讨《C++标准库》这本书中的关键知识点,这些知识点主要集中在C++标准库的基础概念、核心组件以及实际应用等方面。 ### 一、C++标准库概述 #### 1.1 为什么需要C++标准库? C++...
此外,C++标准库还包括了基本类型转换(如`<charconv>`)、容器(如`<deque>`、`<forward_list>`、`<map>`、`<set>`、`<stack>`、`<queue>`、`<unordered_map>`、`<unordered_set>`等)、迭代器、智能指针(如`...
除了上述几个主要部分之外,C++标准库还包括了一些其他的工具,如智能指针、类型转换工具等,这些工具能够帮助开发者更高效地完成任务。 总之,C++标准库是学习和使用C++语言不可或缺的一部分。通过深入了解并熟练...
标准库-web标准库使用指导 本文档对standard library的使用指导进行了详细的介绍,主要涵盖了CGI、Web服务器、boa、CGIC等相关知识点,并提供了Linux下的CGIC-Web标准库开发指导。 一、预备知识 1. 嵌入式Web...
C语言标准库的全貌包括但不限于输入输出函数、字符串操作函数、数学计算函数、时间日期处理函数、内存操作函数、文件操作函数、数据类型转换函数、诊断功能函数以及标准库中的静态数据。 在本书中,详细讨论了这些...
C标准库,全称为C Standard Library,是C编程语言的核心组成部分,为程序员提供了一系列基本功能,包括输入/输出、字符串处理、内存管理、数学运算等。C标准库的实现因平台而异,其中最著名且广泛使用的实现之一就是...
这行代码包含了IEEE Std 1364-2001标准库中的所有基本逻辑类型和元件。通过这种方式,设计师可以方便地使用标准库中的元件来进行设计。 #### 五、Verilog标准库的语法标准规范 Verilog标准库中的元件使用有一定的...
C标准库,全称为C Standard Library,是C编程语言的核心组成部分,它提供了一系列预先定义好的函数和类型,供程序员在编写程序时使用。这个压缩包包含的“C标准库源代码”是C语言爱好者和开发者宝贵的参考资料,可以...
Python标准库是Python编程语言的一个重要组成部分,它为Python提供了丰富的模块,使得开发人员能够不必自行编写所有功能,而是通过使用标准库中的模块来实现各种功能。从给定文件的内容来看,该文档是关于Python标准...
《C++标准库第二版》是一本深度探讨C++编程语言和其标准库的重要书籍,尤其关注了C++11标准引入的新特性和功能。这本书不仅适合初学者,也对有经验的C++开发者有着极高的参考价值。下面将详细阐述书中涉及的主要知识...
根据提供的文件信息,这里将对“Python标准库(中文版)”进行详细的解析与扩展,以便更好地理解Python标准库中的核心概念、功能及其在实际编程中的应用。 ### Python标准库概述 Python标准库是Python语言自带的一...
《Python标准库参考》是Python程序员必备的参考资料,其中详细介绍了Python语言内置的各种模块、类型、函数、异常等,为开发者提供了丰富的内置支持。 1. Python内置函数 Python的标准库包含一系列的内置函数,这些...
C标准库是C语言开发中不可或缺的部分,它提供了一系列预定义的函数和宏,以便程序员在编写程序时调用,实现各种功能,从而不必从零开始编写所有代码。C标准库的使用极大地提高了开发效率,同时也保证了程序的可移植...