STL 有哪些种Iterator?
vector 和deque提供的是Random Access Iterator 随机访问
Random Access Iterator:该类迭代器能完成上面所有迭代器的工作,它自己独有的特性就是可以像指针那样进行算术计算,而不是仅仅只有单步向前或向后迭代。
set和map提供的 iterators是 Forward Iterator 线性访问
Forward Iterator:该类迭代器可以在一个正确的区间中进行读写操作,它拥有Input Iterator的所有特性,和Output Iterator的部分特性,以及单步向前迭代元素的能力。
list提供的是Bidirectional Iterator
Bidirectional Iterator:该类迭代器是在Forward Iterator的基础上提供了单步向后迭代元素的能力。
隐式转换
struct foo{
foo(int x){ /*int 类型的隐式转换构造函数*/
data = x;
}
operator int () const{/*解决1+foo这样的计算的隐式转换*/
return data;
}
int data;
};
int main(int argc, _TCHAR* argv[])
{
foo a =1;
std::cout<<1 + a<<std::endl;
}
C++ 四种cast
1. static_cast
最接近于c的强制转换一般用法
int i = static_cast<int>(3.1415926);此时提供安全的整形转换
OO:中使用不进行动态类型检查,但是编译器进行检查是否被转换的类继承自该父类。
parent * a = new child();
child * p = dynamic_cast<child*>(a);
2. dynamic_cast
动态类型转换,用于父类指针转换成子类指针。并进行动态安全检查。即检查父类指针是否可指向该子类指针。如不可以返回null
使用该关键字的必要条件是类中含有虚表。当进行引用类型转换时。如果不能进行转换,则会抛出异常。
3.const_cast 摘掉const关键字
4.reinterpret_cast 直接进行内容解析,进行无条件的转换。不进行二进制的任何检查。
可将int 转换成 float,更变态的是可将int转换成函数指针。
在OO中:
struct base_a{
virtual ~base_a(){}
};
struct base_b{
virtual ~base_b(){}
};
struct child:public base_a,base_b{
};
struct my_class{
my_class(int x){
data = x;
}
operator int () const{
return data;
}
int data;
};
int _tmain(int argc, _TCHAR* argv[])
{
child * c = new child;
base_a * b0 = reinterpret_cast<base_a*>(c);
printf("%p\n",b0);
b0 = dynamic_cast<base_a*>(c);
printf("%p\n",b0);
base_b * b1 = reinterpret_cast<base_b*>(c);
printf("%p\n",b1);
b1 = dynamic_cast<base_b*>(c);
printf("%p\n",b1);
}
output:
00694DD8
00694DD8
00694DD8
00694DDC
可以看出因为是内存直接不加思索的进行转换。所以在多重继承中会不考虑虚表而导致内存地址与dynamic_cast不一致。
http://blog.youkuaiyun.com/livemylife/article/details/7091552