如何按索引從std :: vector <>擦除元素?

我有一個std :: vector <int>,我想刪除第n個元素。 我怎麼作? 算法

std::vector<int> vec;

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

vec.erase(???);

#1樓

erase方法將以兩種方式使用: spa

  1. 刪除單個元素: 指針

    vector.erase( vector.begin() + 3 ); // Deleting the fourth element
  2. 擦除範圍: code

    vector.erase( vector.begin() + 3, vector.begin() + 5 ); // Deleting from fourth element to sixth element

#2樓

若是您使用大向量(大小> 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中。 而後將其複製到vec2中。 很是快。 要處理20,000,000個元素,此算法僅需0.8秒! element

我對擦除方法作了一樣的事情,這須要不少時間: rem

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樓

實際上, erase功能適用於兩個配置文件: get

  • 刪除單個元素 it

    iterator erase (iterator position);
  • 刪除一系列元素 io

    iterator erase (iterator first, iterator last);

因爲std :: vec.begin()標記了容器的開始,若是咱們要刪除向量中的ith元素,則可使用:

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

若是仔細觀察,vec.begin()只是指向向量起始位置的指針,將i的值添加到它的位置會將指針增長到i的位置,所以咱們能夠經過如下方式訪問指向ith元素的指針:

&vec[i]

因此咱們能夠這樣寫:

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

#4樓

要刪除元素,請使用如下方法:

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


#5樓

先前的答案假定您始終具備帶符號的索引。 可悲的是, 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;
}
相關文章
相關標籤/搜索