我有一个std::vector<int>,我想删除第n个元素。我怎么做呢?
std::vector<int> vec;
vec.push_back(6);
vec.push_back(-17);
vec.push_back(12);
vec.erase(???);
我有一个std::vector<int>,我想删除第n个元素。我怎么做呢?
std::vector<int> vec;
vec.push_back(6);
vec.push_back(-17);
vec.push_back(12);
vec.erase(???);
当前回答
如果你使用较大的向量(大小为> 100,000),并且想要删除大量的元素,我建议这样做:
int main(int argc, char** argv) {
vector <int> vec;
vector <int> vec2;
for (int i = 0; i < 20000000; i++){
vec.push_back(i);}
for (int i = 0; i < vec.size(); i++)
{
if(vec.at(i) %3 != 0)
vec2.push_back(i);
}
vec = vec2;
cout << vec.size() << endl;
}
该代码获取vec中不能被3整除的所有数字,并将其复制到vec2。然后在vec中复制vec2。它非常快。要处理200,000,000个元素,这个算法只需要0.8秒!
我用擦除方法做了同样的事情,这需要很多很多时间:
Erase-Version (10k elements) : 0.04 sec
Erase-Version (100k elements) : 0.6 sec
Erase-Version (1000k elements): 56 sec
Erase-Version (10000k elements): ...still calculating (>30 min)
其他回答
我建议阅读这篇文章,因为我相信这就是你在寻找的东西。https://en.wikipedia.org/wiki/Erase%E2%80%93remove_idiom
举个例子
vec.erase(vec.begin() + 1, vec.begin() + 3);
你将擦除向量的第n个元素,但当你擦除第二个元素时,向量的所有其他元素将被移动,向量的大小将为-1。如果循环遍历vector,这可能是个问题,因为vector size()正在减小。如果你有这样的问题,建议使用标准c++库中现有的算法。和"remove"或"remove_if"。
希望这对大家有所帮助
删除一个元素的方法如下:
// declaring and assigning array1
std:vector<int> array1 {0,2,3,4};
// erasing the value in the array
array1.erase(array1.begin()+n);
欲了解更广泛的概况,请访问:http://www.cplusplus.com/reference/vector/vector/erase/
实际上,擦除功能适用于两种配置文件:
删除单个元素 迭代器擦除(迭代器位置); 删除一系列元素 迭代器擦除(迭代器先,迭代器后);
因为std:: vvector .begin()标志着容器的开始,如果我们想删除vector中的第i个元素,我们可以使用:
vec.erase(vec.begin() + index);
如果你仔细观察,vecc .begin()只是一个指向我们的向量的起始位置的指针,并且向它添加i的值将增加指向i位置的指针,因此我们可以通过以下方式访问指向第i个元素的指针:
&vec[i]
所以我们可以这样写:
vec.erase(&vec[i]); // To delete the ith element
最快的方法(对于时间复杂度()=常量的编程竞赛)
可在1秒内擦除100M项目;
vector<int> it = (vector<int>::iterator) &vec[pos];
vec.erase(it);
最易读的方式: Vec.erase (vec.begin() + pos);
如果你使用较大的向量(大小为> 100,000),并且想要删除大量的元素,我建议这样做:
int main(int argc, char** argv) {
vector <int> vec;
vector <int> vec2;
for (int i = 0; i < 20000000; i++){
vec.push_back(i);}
for (int i = 0; i < vec.size(); i++)
{
if(vec.at(i) %3 != 0)
vec2.push_back(i);
}
vec = vec2;
cout << vec.size() << endl;
}
该代码获取vec中不能被3整除的所有数字,并将其复制到vec2。然后在vec中复制vec2。它非常快。要处理200,000,000个元素,这个算法只需要0.8秒!
我用擦除方法做了同样的事情,这需要很多很多时间:
Erase-Version (10k elements) : 0.04 sec
Erase-Version (100k elements) : 0.6 sec
Erase-Version (1000k elements): 56 sec
Erase-Version (10000k elements): ...still calculating (>30 min)