首页 文章

如何通过索引从std :: vector <>中删除元素?

提问于
浏览
398

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

std::vector<int> vec;

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

vec.erase(???);

10 回答

  • 48

    要删除单个元素,您可以执行以下操作:

    std::vector<int> vec;
    
    vec.push_back(6);
    vec.push_back(-17);
    vec.push_back(12);
    
    // Deletes the second element (vec[1])
    vec.erase(vec.begin() + 1);
    

    或者,一次删除多个元素:

    // Deletes the second through third elements (vec[1], vec[2])
    vec.erase(vec.begin() + 1, vec.begin() + 3);
    
  • 2

    std :: vector上的erase方法被重载,因此调用它可能更清晰

    vec.erase(vec.begin() + index);
    

    当你只想删除一个元素时 .

  • 0
    template <typename T>
    void remove(std::vector<T>& vec, size_t pos)
    {
        std::vector<T>::iterator it = vec.begin();
        std::advance(it, pos);
        vec.erase(it);
    }
    
  • 13

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

    • 擦除单个元素:
    vector.erase( vector.begin() + 3 ); // Deleting the fourth element
    
    • 删除元素范围:
    vector.erase( vector.begin() + 3, vector.begin() + 5 ); // Deleting from fourth element to sixth element
    
  • 545

    实际上, erase 函数适用于两个配置文件:

    • 删除单个元素
    iterator erase (iterator position);
    
    • 删除一系列元素
    iterator erase (iterator first, iterator last);
    

    由于std :: vec.begin()标记容器的开头,如果我们想删除向量中的第i个元素,我们可以使用:

    vec.erase(vec.begin() + index);
    

    如果仔细观察,vec.begin()只是指向我们向量的起始位置的指针,并且将i的值添加到它会将指针递增到i位置,所以我们可以通过以下方式访问指向第i个元素的指针:

    &vec[i]
    

    所以我们可以写:

    vec.erase(&vec[i]); // To delete the ith element
    
  • 179

    如果你有一个无序的向量,你可以利用它无序的事实,并使用我在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;
    }
    

    由于列表顺序无关紧要,只需取出列表中的最后一个元素并将其复制到要删除的项目的顶部,然后弹出并删除最后一项 .

  • 5

    如果您使用大型矢量(大小> 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 . 它非常快 . 要处理20,000,000个元素,此算法仅需0.8秒!

    我使用erase-method做了同样的事情,需要花费大量的时间:

    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)
    
  • 3

    要删除元素,请使用以下方法:

    // declaring and assigning array1 
    std:vector<int> array1 {0,2,3,4};
    
    // erasing the value in the array
    array1.erase(array1.begin()+n);
    

    如需 more broad overview ,您可以访问:http://www.cplusplus.com/reference/vector/vector/erase/

  • 0

    之前的答案假设您 always 有一个签名索引 . 遗憾的是, std::vector 使用 size_type 进行索引,使用 difference_type 进行迭代算术运算,因此如果启用了"-Wconversion"和朋友,则它们不能一起工作 . 这是回答问题的另一种方法,同时能够处理签名和未签名:

    去除:

    template<class T, class I, class = typename std::enable_if<std::is_integral<I>::value>::type>
    void remove(std::vector<T> &v, I index)
    {
        const auto &iter = v.cbegin() + gsl::narrow_cast<typename std::vector<T>::difference_type>(index);
        v.erase(iter);
    }
    

    采取:

    template<class T, class I, class = typename std::enable_if<std::is_integral<I>::value>::type>
    T take(std::vector<T> &v, I index)
    {
        const auto &iter = v.cbegin() + gsl::narrow_cast<typename std::vector<T>::difference_type>(index);
    
        auto val = *iter;
        v.erase(iter);
    
        return val;
    }
    
  • 5

    如果你想通过在vector中找到它的值来删除一个元素,你还需要在vector上执行此操作 .

    vector<int> ar(n);
    ar.erase(remove(ar.begin(), ar.end()), (place your value here from vector array));
    

    它会从这里删除你的 Value . 谢谢

相关问题