首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >shrink_to_fit()函数是否删除空指针?

shrink_to_fit()函数是否删除空指针?
EN

Stack Overflow用户
提问于 2020-04-13 17:39:06
回答 4查看 223关注 0票数 0

我想问您有关vector::shrink_to_fit()函数的问题。

假设我已经得到了指向对象的指针向量(在我的例子中是unique_ptr ),并且我希望将其大小调整为它存储的对象的数量。

在某些时候,我选择使用unique_ptr的function ()函数从向量中删除一些对象,因此,据我所知,在向量中的特定位置有一个空指针。

所以我想调整它的大小,删除向量元素之间的空指针,我想问我是否可以用shrink_to_fit()函数来完成这个任务?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-04-13 21:13:40

最后,我发现的解决方案很简单:

代码语言:javascript
复制
void Controller::delete_allocated_memory(int index)
{
    m_vec.erase(m_vec.begin() + index);
    m_vec.shrink_to_fit();
}

即使向量是由unique_ptrs组成的,它也能工作得很好,据我所知,它甚至没有创建我所说的空指针,而是移动了向量中的所有现有对象。

你认为如何?

票数 0
EN

Stack Overflow用户

发布于 2020-04-13 17:52:49

不,shrink_to_fit不改变矢量的内容或大小。它所能做的就是在幕后将一些内部内存释放回较低级别的库或操作系统等。它可能使迭代器、指针和引用失效,但您可能看到的唯一其他更改是减少capacity()。对于shrink_to_fit来说,完全不做任何事情也是有效的。

听起来你想要“擦除”成语

代码语言:javascript
复制
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看起来就像:

代码语言:javascript
复制
vec.erase(nullptr);
票数 2
EN

Stack Overflow用户

发布于 2020-04-13 17:47:13

这个快速测试表明你不能这样做。

代码语言:javascript
复制
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;

结果:

代码语言:javascript
复制
0
16
10
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61193450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档