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;