从 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<myvector::value_type>(myvector.begin()+N, myvector.end()).swap(myvector);
。
@ildjarn,谢谢 - 我知道有一种方法可以用一个未命名的临时来做到这一点,但我的大脑冻结了。我已经使用您的确切文字更新了我的答案。
@ild:你真的可以将::
运算符与非类型一起使用吗?
@FredOverflow,我想他是从我这里抄来的。我想你可以,但我没有测试它。
@FredOverflow :马克是正确的,我从他那里复制并没有注意到。实际上,它当然是myvector_t::value_type
或decltype(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<T>( v.begin() + std::min( N, v.size() ). v.end() )
以上是关于从 std::vector 中删除前 N 个元素的主要内容,如果未能解决你的问题,请参考以下文章
为啥从 std::vector 中随机删除比 std::list 快?
是否有一个函数可以从向量中删除一个元素而不在 c++ stdlib 中移动它?