考虑以下功能:
void shrink_string(std::string& str) {
if (str.size() >= 2) {
str.resize(str.size() - 2);
}
}
我不知道是否可以将此函数声明为noexcept
(假定为C ++ 11标准)?我知道the documentation不会将.resize()
声明为noexcept,但这主要是因为此方法可用于增长和收缩字符串。
显然,可以通过使字符串的容量保持不变并简单地减少内部长度来实现收缩。同时resize()
可能决定以任何方式重新分配,以释放一些内存,但是如果重新分配抛出错误,它是否会降级到微不足道的调整大小?
从docs:
如果容器缩小,则所有未删除的元素的迭代器,指针和引用在调整大小后仍然有效,并且引用的是与调用之前引用的元素相同的元素。
因此,将向量的大小调整为较小的值不会改变内存(使用shrink_to_fit
代替(建议a)将容量减小到该大小)。