首页 文章

C按值而不是按位置擦除矢量元素? [重复]

提问于
浏览
208

这个问题在这里已有答案:

vector<int> myVector;

并且让我们说向量中的值是这个(按此顺序):

5 9 2 8 0 7

如果我想删除包含值“8”的元素,我想我会这样做:

myVector.erase(myVector.begin()+4);

因为这会抹掉第4个元素 . 但有没有办法根据值“8”擦除元素?喜欢:

myVector.eraseElementWhoseValueIs(8);

或者我只是需要遍历所有的向量元素并测试它们的值?

4 回答

  • 325

    相反如何std::remove()

    #include <algorithm>
    ...
    vec.erase(std::remove(vec.begin(), vec.end(), 8), vec.end());
    

    这种组合也称为erase-remove idiom .

  • 73

    您可以使用 std::find 获取值的迭代器:

    #include <algorithm>
    std::vector<int>::iterator position = std::find(myVector.begin(), myVector.end(), 8);
    if (position != myVector.end()) // == myVector.end() means the element was not found
        myVector.erase(position);
    
  • 10

    你不能直接这样做 . 您需要使用 std::remove 算法将要擦除的元素移动到向量的末尾,然后使用 erase 函数 . 类似的东西: myVector.erase(std::remove(myVector.begin(), myVector.end(), 8), myVec.end()); . 有关详细信息,请参阅erasing elements from vector .

  • 0

    Eric Niebler正在研究范围提案,而examples则展示了如何删除某些元素 . 删除8.是否创建新矢量 .

    #include <iostream>
    #include <range/v3/all.hpp>
    
    int main(int argc, char const *argv[])
    {
        std::vector<int> vi{2,4,6,8,10};
        for (auto& i : vi) {
            std::cout << i << std::endl;
        }
        std::cout << "-----" << std::endl;
        std::vector<int> vim = vi | ranges::view::remove_if([](int i){return i == 8;});
        for (auto& i : vim) {
            std::cout << i << std::endl;
        }
        return 0;
    }
    

    输出

    2 4 6 8 10 ----- 2 4 6 10

相关问题