过去一周的刷题总结

1.容器可调用sort排序函数,默认从小到达排序,如果是string类型,则按照字典序对其进行排序

2.哈希(散列)函数:哈希的过程中需要使用哈希函数进行计算。哈希函数是一种映射关系,根据数据的关键词 key ,通过一定的函数关系,计算出该元素存储位置的函数。表示为:address = H [key]

  散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位。

3.关于map容器:问:当map插入数据时,如果key相同,value会被覆盖么?

答:map容器插入键值对的方法一般有两种:

1. map["key"] = value;                   //  [] =  方法:通过 map[key] = value 实现覆盖,进行数据的更新
2. map.insert(make_pair<>(key, value));  // insert 方法:先判断map中是否存在相同的key,若存在则放弃插入操作,直接返回;若不存在,执行插入操作

4.vector越界问题

int main(){
​
vector<int> ivec(10);
​
cout<<ivec[0]<<endl;
​
cout<<ivec[100]<endl;}

vector中包含三个迭代器:first迭代器指向第一个元素;finish迭代器指向最后一个有效元素的下一个位置;end_of_storage迭代器指向整个vector空间末尾的下一个位置。访问vector中的成员都是通过这三个迭代器实现的。 通过下标访问vector中的元素时不会做边界检查,即便下标越界。也就是说,下标与first迭代器相加的结果超过了finish迭代器的位置,程序也不会报错,而是返回这个地址中存储的值。 第一行代码没有任何问题,输出首元素的值。虽然第二行代码逻辑上有问题,属于典型的越界访问,但是程序仍然会编译通过并输出对应地址的值。 如果想在访问vector中的元素时首先进行边界检查,可以使用vector中的at函数。通过使用at函数不但可以通过下标访问vector中的元素,而且在at函数内部会对下标进行边界检查。 综上所述,程序编译通过并正常运行,首选输出first迭代器对应地址中的值,然后再输出first+100对应地址的值。

5.面试:释放内存的问题

void* p = new int;
    int* pint = static_cast<int*>(p);
    *pint = 20;
    cout << *pint << endl;
    delete pint;
    int* qint = static_cast<int*>(p);
    *qint = 30;

如上述代码:

p用new开辟了内存空间,pint指向了p开辟的内存空间,但是程序最后delete了pint,两个指针指向了同一块内存,最后delete了,按理说没有什么问题,但是在delete之后,qint又指向了p那块内存,但是*qint还是可以用,所以就出现了问题:被释放的内存为什么还能被用?

答:因为这块内存暂时没有别人用

所以当使用完内存空间的时候,给指针赋为空

void* p = new int;
    int* pint = static_cast<int*>(p);
    *pint = 20;
    cout << *pint << endl;
    delete pint;
    pint = nullptr;
    p = nullptr;
    int* qint = static_cast<int*>(p);
    *qint = 30;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我在凌晨等太阳¤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值