我有一个std::vector<int>,我想删除第n个元素。我怎么做呢?

std::vector<int> vec;

vec.push_back(6);
vec.push_back(-17);
vec.push_back(12);

vec.erase(???);

当前回答

删除一个元素的方法如下:

// 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/

其他回答

删除一个元素的方法如下:

// 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/

我建议阅读这篇文章,因为我相信这就是你在寻找的东西。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"。

希望这对大家有所帮助

如果你使用较大的向量(大小为> 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)

erase方法将以两种方式使用:

擦除单个元素: 向量。Erase (vector.begin() + 3);//删除第四个元素 元素擦除范围: 向量。删除(vector.begin() + 3, vector.begin() + 5);//从第4个元素删除到第6个元素

如果你有一个无序向量,你可以利用它是无序的这一事实,并使用我在CPPCON上从Dan Higgins那里看到的东西

template< typename TContainer >
static bool EraseFromUnorderedByIndex( TContainer& inContainer, size_t inIndex )
{
    if ( inIndex < inContainer.size() )
    {
        if ( inIndex != inContainer.size() - 1 )
            inContainer[inIndex] = inContainer.back();
        inContainer.pop_back();
        return true;
    }
    return false;
}

由于列表顺序无关紧要,只需取列表中的最后一个元素并将其复制到您想要删除的项之上,然后弹出并删除最后一项。