两个C++小问题汇总

本文对近期使用C++的两个问题进行汇总。

static_cast enum 到未定义的值

https://stackoverflow.com/questions/18195312/what-happens-if-you-static-cast-invalid-value-to-enum-class

对于这个问题,上面的回答解释了这个问题。显然这是一个未定义行为,以后在使用时要注意。

如果将一个外部输入的数字直接cast到enum上,那么这就是不可控的行为。 这的确是我思考的不对

vector::reserve()的相关用法

为了实现C++11中的shrink_to_fit函数,我们可以借助reserve来实现对空间的释放。

这里有一个比较坑的点在于,reserve函数只处理n大于当前cap的情况,如果n小于当前的cap,那么这个函数是不做任何行为的。

所以如下代码reserve函数基本没有进行任何操作,详见http://www.cplusplus.com/reference/vector/vector/reserve/

std::vector<int> v(10000);
v.erase(v.begin() + 10, v.end());
v.reserve(10);  //Not working

所以即使采用:

v.reserve(v.size());

也是不行的。

一种比较好的方式是使用如下方式来实现shrink_to_fit

std::vector<int>(v).swap(v);

这个实现方式是这样,使用std::vector(v)新建了一个临时对象,他使用了v.size()来对这个临时对象进行初始化,然后使用std::copy函数来对数据进行拷贝。这样新建的对象就没有任何空间浪费。

然后使用swap交换了内部的指针,这样临时对象中的指针和空间就到了v中,v原本的数据就在这个临时对象中,并随着生命周期被释放。

然而,这还要复制一遍,不如直接使用shrink_to_fit爽。。

其实在某些场景下,deque会比vector更合适。因为它使用的是分段的内存块,而不是连续的内存块。

Ref