第七章 数据结构与类型转化

前言 C++  学习路线,本人主要也是为了记录一下自己的学习过程

目录

一、vector

二、新式类型转化


一、vector

vector 为存储的对象分配一块连续的地址空间,因此对vector中的元素随机访问效率很高。在vecotor中插入或者删除某个元素,需要将现有元素进行复制, 移动。如果vector中存储的对象很大,或者构造函数复杂,则在对现有元素进行拷贝时开销较大,因为拷贝对象要调用拷贝构造函数。对于简单的小对 象,vector的效率优于list。vector在每次扩张容量的时候,将容量扩展2倍,这样对于小对象来说,效率是很高的。

list中的对象是离散存储的,随机访问某个元素需要遍历list。在list中插入元素,尤其是在首尾插入元素,效率很高,只需要改变元素的指针。

综上所述:

vector适用:对象数量变化少,简单对象,随机访问元素频繁

list适用:对象数量变化大,对象复杂,插入和删除频繁

最大的区别是,list是双向的,而vector是单向的。因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定一般应遵循下面的原则:  

        1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector  

        2、如果你需要大量的插入和删除,而不关心随即存取,则应使用list  

数据结构体操作 Vector 类似于java的 list

list 类似java双向链表 DoubleLinkList


二、新式类型转化

//  const_cast 修改是const或者volatile的属性

//  dynamic_cast<> 多态的转化

//  static_cast 处理基础类型

//  reinterpret_cast<> 对指针、引用进行原始转换

//修改类型的const或volatile属性

const char *a;

char *b = const_cast<char*>(a);

    

char *a;

const char *b = const_cast<const char*>(a);

### static_cast

>1. 基础类型之间互转。如:float转成int、int转成unsigned int等

>2. 指针与void之间互转。如:float\*转成void\*、Bean\*转成void\*、函数指针转成void\*等

>3. 子类指针/引用与 父类指针/引用 转换。

class Parent {

public:

    void test() {

        cout << "p" << endl;

    }

};

class Child :public Parent{

public:

     void test() {

        cout << "c" << endl;

    }

};

Parent  *p = new Parent;

Child  *c = static_cast<Child*>(p);

//输出c

c->test();

//Parent test加上 virtual 输出 p

### dynamic_cast

> 主要 将基类指针、引用 安全地转为派生类.

> 在运行期对可疑的转型操作进行安全检查,仅对多态有效

//基类至少有一个虚函数

//对指针转换失败的得到NULL,对引用失败  抛出bad_cast异常

Parent  *p = new Parent;

Child  *c = dynamic_cast<Child*>(p);

if (!c) {

    cout << "转换失败" << endl;

}

Parent  *p = new Child;

Child  *c = dynamic_cast<Child*>(p);

if (c) {

    cout << "转换成功" << endl;

}

### reinterpret_cast

> 对指针、引用进行原始转换


float i = 10;


//&i float指针,指向一个地址,转换为int类型,j就是这个地址
int j = reinterpret_cast<int>(&i);
cout  << hex << &i << endl;
cout  << hex  << j << endl;


cout<<hex<<i<<endl; //输出十六进制数
cout<<oct<<i<<endl; //输出八进制数
cout<<dec<<i<<endl; //输出十进制数

### char*int转换

//char* 转int float

int i = atoi("1");

float f = atof("1.1f");

cout << i << endl;

cout << f << endl;

    

//int 转 char*

char c[10];

//10进制

itoa(100, c,10);

cout << c << endl;



//int 转 char*

char c1[10];

sprintf(c1, "%d", 100);

cout << c1 << endl;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值