一、语法
1、explicit的作用
explicit可以禁止单参数构造函数被自动用于型别转换和采用赋值方式的带有型别转换的初始化。实例如下:
#include <stdlib.h>
class stack
{
public:
stack()
{
this->capacity=0;
p=NULL;
}
stack(int n)
{
if(n>0)
{
this->capacity=n;
p=new int[n];
}
else
{
p=NULL;
capacity=0;
}
}
private:
int capacity;
int *p;
};
这段代码定义了stack类,其接受一个int型变量初始化大小。但是,在这种情况下,有下面两个表达式:
#include "explict.h"
int main()
{
stack s1(10);//容量大小为10
stack s2=10;//将10转换为stack
return 0;
}
其中第二个表达式将“10”转化为了stack,这在一般情况下都是不符合我们的意思的。加上explicit以后,代码如下:
#include <stdlib.h>
class stack
{
public:
stack()
{
this->capacity=0;
p=NULL;
}
explicit stack(int n)
{
if(n>0)
{
this->capacity=n;
p=new int[n];
}
else
{
p=NULL;
capacity=0;
}
}
private:
int capacity;
int *p;
};
这时,表达式“stack s2=10;”会产生编译错误,意思无法将int转为stack。
二、迭代器
1、vs实现的STL将back_inserter放在了iterator头文件里
2、STL中的特殊迭代器
(1)插入迭代器 Insert Iterator
一般的迭代器都是指向某个已存在元素的位置或者最后一个元素的下一个位置。而插入迭代器可以指向用于插入操作的位置。换句话说,此位置当前并不属于容器,也没有有效的元素。然而,相关插入算法可以利用插入迭代器完成插入操作。
插入迭代器包括back_inserter、front_inserter和inserter。
back_inserter用于支持push_back的容器(list、vector和deque),front_inserter用于支持push_front的容器(list和deque);inserter作用是将元素插入指定的位置(用于支持insert的容器,而所有的容器都支持insert)。示例代码如下:
typedef vector<int> intVector;
typedef list<int> intList;
typedef deque<int> intDeque;
typedef set<int> intSet;
typedef multiset<int> intMultiset;
typedef map<int,int> intMap;
typedef multimap<int,int> intMultimap;
intVector vec;
intList list;
intDeque deque;
intMap map;
intSet set;
intMultimap mulmap;
intMultiset mulset;
for(int i=1;i<=10;++i)
{
vec.push_back(i);
}
copy(vec.begin(),vec.end(),back_inserter(list)); //将vec内的元素插入list尾部
copy(vec.begin(),vec.end(),front_inserter(deque)); //将vec元素插入deque头部
copy(vec.begin(),vec.end(),insert(mulset,mulset.begin()));//将vec元素插入multiset的起始位置
(2)流迭代器 Stream Iterator
流迭代器是用于读写stream的迭代,包括ostream_iterator和istream_iterator。其中istream_iterator与输入流关联,从输入流中读取数据;ostream_iterator与输出流关联ÿ