目录
string类
string类的构造函数
构造函数 | 描述 |
---|---|
string(const char*s) | 将string对象初始化为s指向的NBTS |
string(size_type n,char c) | 创建一个包含n个元素的string对象,其中每个元素都被初始化为字符c |
string(const string & str) | 将一个string对象初始化为string对象str(复制构造函数) |
string() | 创建一个默认的string对象,长度为0(默认构造函数) |
string(const char*s,size_type n) | 将string对象初始化为s指向的NBTS的前n个字符,即使超过额NBTS结尾 |
template<class Iter> string(Iter begin,Iter end) | 将string对象初始化为区间[begin,end)内的字符 |
string(const string & str,string size_type pos=0,size_type n = npos) | 将一个string对象初始化为对象str中从位置pos开始到结尾的字符,或从位置pos开始的n个字符 |
string(string && str) noexcept | 将一个string对象初始化为string对象str,并可能修改str |
string(initializer_list il | 将一个string对象初始化为初始化列表il的字符 |
string类输入
对于C*风格字符串,有三种方式:
char info[100];
cin>>info //read a word
cin.getline(info,100);//read a line, discard \n
cin.get(info,100);//read a line, leave \n in queue
对于string对象,有两种方式:
string stuff;
cin>>stuff;//read a word
getline(cin,stuff);//read a line, discard \n
两个版本的getline()都有一个可选参数,用于指定使用哪个字符来确定输入的边界:
cin.getline(info,100,':');//read up to :,discard :
getline(stuff,':');//read up to :,discard :
功能上,string版本的getline()将自动调整目标string对象的大小,使之能够存储输入的字符。
string版本的getline()的三种情况:
- 到达文件尾,输入流的eofbit将被设置,意味着fail()和eof()都将返回true;
- 遇到分界字符(默认为\n),在这种情况下,把分界字符从输入流中删除,但不存储它;
- 读取的字符数达到最大允许值,将设置输入流的failbit,意味着fail()返回true。
输入流对象有个统计系统,检测到文件尾后设置eofbit寄存器,检测到输入错误时将设置failbit寄存器,出现无法识别的故障时将设置badbit寄存器。
string版本的operator>>()不断读取,直到遇到空白字符并将其留在输入队列中。空白字符是指空格、换行符和制表符。
重载的find()方法
方法原型 | 描述 |
---|---|
size_type find(const string & str, size_type pos=0) const | 从字符串的pos位置开始查找子字符串str。如果找到,则返回该子字符串首次出现其首字符的索引;否则,返回string::npos |
size_type find(const char*s,size_type pos=0)const | 从字符串的pos位置开始,查找子字符串s。如果找到,则返回该子字符串首次出现时其首字符的索引;否则,返回string::npos |
size_type find(const char*s,size_type pos = 0,size_type n) | 从pos开始,查找s的前n个字符组成的子字符串… |
size_type find(char ch, size_type pos=0)const | 从字符串的pos位置开始,查找字符ch。如果找到,返回该字符首次出现的位置;否则返回string::npos |
注意:open()要求使用一个C-风格字符串作为参数,c_str()方法返回一个指向C-风格字符串的指针。
智能指针模板类
创建智能指针对象,必须包含头文件memory。
auto_ptr、unique_ptr、shared_ptr在过期时,自动释放内存。
auto_ptr<double> pd(new double);
如果程序要使用多个指向同一个对象的指针,应选择shared_ptr;如果程序不需要多个指向同一个对象的指针,则可以使用unique_ptr。
标准模板库
模板类vector
迭代器:是一个广义指针。
为vector的double类型规范声明一个迭代器:
vector<double> :: iterator pd;
假设scores是一个vector<double>
对象:vector<double> scores;
可以使用迭代器pd执行如下操作:
pd=scores.begin();
*pd=22.3;
++pd;
C++可以进行自动推断:auto pd = scores.begin();
泛型编程
模板使得算法独立于存储的数据类型,而迭代器使算法独立于使用的容器类型。
序列:7种STL容器类型(deque、forward_list、list、queue、priority_queue、stack和vector)都是序列。
vector
提供自动内存管理功能、可以动态改变vector对象的长度。提供对元素的随机访问。在尾部添加和删除元素的时间是固定的,但是在头部或中间插入和删除元素的复杂度为线性时间。可反转
deque
表示双端队列,在开始位置插入和删除元素的时间是固定的。
list
表示双向链表,除了首尾元素,每个元素都与前后的元素相链接,这意味可以双向遍历链表。list在链表中任意位置进行插入和删除的时间是固定的。强调元素的快速插入和删除。可反转。
forward_list
单链表,每个节点只链接到下一个节点。不可反转。
queue
是一个适配器类,不允许随机访问队列元素,甚至不允许遍历队列。只能对队首尾操作、检测元素数目和队列是否为空
priority_queue
另一种适配器。最大元素被移到队首,默认底层类是vector。
stack
是个适配器,为底层类(默认是vector)提供了典型的栈接口。
关联容器
基于树结构。
将值与键关联在一起,并使用键查找值。set的值类型和键相同,键是唯一的,对set来说,值就是键。multiset类似于set,只是可能有多个值的键相同。在map中,值和键的类型不同,键是唯一的,每个键只对应一个值。multimap与map相似,只是一个键可以与多个值相关联。
无序关联容器
基于数据结构哈希表。
函数对象
函数对象(函数名)也叫函数符。
函数符概念
- 生成器是不用参数就可以调用的函数符;
- 一元函数是用一个参数可以调用的函数符;
- 二元函数是用两个参数可以调用的函数符;
- 返回boo值的一元函数是谓词;
- 返回bool值的二元函数是二元谓词;
binder1st(f2,val) f1;
将val赋给f2的第一个参数。f1(x) 等价于f2(val,x)。
binder2nd
将常数赋给第二个参数。