从 std::vector 中删除前 N 个元素

Posted

技术标签:

【中文标题】从 std::vector 中删除前 N 个元素【英文标题】:Remove first N elements from a std::vector 【发布时间】:2011-11-13 04:38:13 【问题描述】:

我似乎想不出一种可靠的方法(也可以压缩内存)从std::vector 中删除前 N 个元素。怎么做呢?

【问题讨论】:

您愿意改成std::deque吗?这样做效率更高。 没关系!今天我的大脑严重冻结。 @Dilip?费力?为何如此? STL 容器只需更改一行即可轻松交换,只要您正确使用它们,如果不能,您可能没有正确使用它们? @Dilip :听起来有人没有足够明智地使用typedef。 ;-] 你不能 typedef 认为std:vector<T> 是连续的而std::deque 不是,这在与需要 T* 的遗留代码交互时非常重要。但是对于这样的代码,您可能无法删除前 N 个元素,而是传递 &v[N] 【参考方案1】:

由于您提到要压缩内存,因此最好将所有内容复制到新向量并使用交换习语。

std::vector<decltype(myvector)::value_type>(myvector.begin()+N, myvector.end()).swap(myvector);

【讨论】:

或者更简洁地说,std::vector&lt;myvector::value_type&gt;(myvector.begin()+N, myvector.end()).swap(myvector); @ildjarn,谢谢 - 我知道有一种方法可以用一个未命名的临时来做到这一点,但我的大脑冻结了。我已经使用您的确切文字更新了我的答案。 @ild:你真的可以将:: 运算符与非类型一起使用吗? @FredOverflow,我想他是从我这里抄来的。我想你可以,但我没有测试它。 @FredOverflow :马克是正确的,我从他那里复制并没有注意到。实际上,它当然是myvector_t::value_typedecltype(myvector)::value_type【参考方案2】:

使用.erase() 方法:

// Remove the first N elements, and shift everything else down by N indices
myvec.erase(myvec.begin(), myvec.begin() + N);

这将需要从索引 N+1 到末尾复制所有元素。如果你有一个很大的向量并且会经常这样做,那么请改用std::deque,它可以更有效地从前面删除元素。

【讨论】:

他也想压缩内存。 @Adam 谢谢!我不知道我怎么错过了这样一个直截了当的事情。非常感谢! @Mooing 我确实在我的帖子中提到了这一点,但就目前而言,这对我来说不太关心。虽然我很想知道是否有办法也可以压缩内存。【参考方案3】:
v.erase( v.begin(), v.size() > N ?  v.begin() + N : v.end() );

不要忘记检查尺寸,以防万一。

【讨论】:

@Mooing Duck 我错过了。在这种情况下,他必须创建一个新向量:std::vector&lt;T&gt;( v.begin() + std::min( N, v.size() ). v.end() )

以上是关于从 std::vector 中删除前 N 个元素的主要内容,如果未能解决你的问题,请参考以下文章

从 std::vector 中删除多个对象?

使用模板时如何从 std::vector 中删除元素?

为啥从 std::vector 中随机删除比 std::list 快?

是否有一个函数可以从向量中删除一个元素而不在 c++ stdlib 中移动它?

std::vector 在清除或删除 POD 时的行为是不是不同

为啥 vector::clear 不从向量中删除元素?