我想问您有关vector::shrink_to_fit()函数的问题。
假设我已经得到了指向对象的指针向量(在我的例子中是unique_ptr ),并且我希望将其大小调整为它存储的对象的数量。
在某些时候,我选择使用unique_ptr的function ()函数从向量中删除一些对象,因此,据我所知,在向量中的特定位置有一个空指针。
所以我想调整它的大小,删除向量元素之间的空指针,我想问我是否可以用shrink_to_fit()函数来完成这个任务?
发布于 2020-04-13 21:13:40
最后,我发现的解决方案很简单:
void Controller::delete_allocated_memory(int index)
{
m_vec.erase(m_vec.begin() + index);
m_vec.shrink_to_fit();
}即使向量是由unique_ptrs组成的,它也能工作得很好,据我所知,它甚至没有创建我所说的空指针,而是移动了向量中的所有现有对象。
你认为如何?
发布于 2020-04-13 17:52:49
不,shrink_to_fit不改变矢量的内容或大小。它所能做的就是在幕后将一些内部内存释放回较低级别的库或操作系统等。它可能使迭代器、指针和引用失效,但您可能看到的唯一其他更改是减少capacity()。对于shrink_to_fit来说,完全不做任何事情也是有效的。
听起来你想要“擦除”成语
vec.erase(std::remove(vec.begin(), vec.end(), nullptr), vec.end());std::remove移动所有不等于左nullptr的元素,以填补“空白”。但是它不会改变向量的大小;相反,它会在移位元素序列之后将迭代器返回到向量中的位置;其余的元素仍然存在,但已经被移出。然后,erase成员函数去掉那些不必要的结束元素,从而减小向量的大小。
或者,正如@chris所指出的,C++20在std::vector和相关的erase_if中添加了一个过载,这使得事情变得更简单。它们可能已经在MSVC 2019中得到了支持。使用新的erase看起来就像:
vec.erase(nullptr);发布于 2020-04-13 17:47:13
这个快速测试表明你不能这样做。
int x = 1;
vector<int*> a;
cout << a.capacity() << endl;
for (int i = 0; i < 10; ++i) {
a.push_back(&x);
}
cout << a.capacity() << endl;
a[9] = nullptr;
a.shrink_to_fit();
cout << a.capacity() << endl;结果:
0
16
10https://stackoverflow.com/questions/61193450
复制相似问题