C++容易被忽略的基础知识

本文详细介绍了C++中的迭代器种类,包括RandomAccessIterator、ForwardIterator、BidirectionalIterator,以及如何通过隐式转换实现不同类型的迭代器间的灵活操作。重点探讨了迭代器在STL容器如vector、deque、set、map、list中的应用,以及在多重继承场景下使用reinterpret_cast和dynamic_cast进行类型转换时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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不一致。


c++ traits

http://blog.youkuaiyun.com/livemylife/article/details/7091552

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值