代码之家  ›  专栏  ›  技术社区  ›  Jake Wilson

C++擦除向量元素的值而不是位置?[副本]

  •  218
  • Jake Wilson  · 技术社区  · 15 年前
    vector<int> myVector;
    

    假设向量中的值是这样的(按顺序):

    5 9 2 8 0 7
    

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

    myVector.eraseElementWhoseValueIs(8);
    

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

    4 回复  |  直到 7 年前
        1
  •  479
  •   Community CDub    9 年前

    怎么样 std::remove()

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

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

        2
  •  117
  •   Community CDub    9 年前

    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);
    
        3
  •  13
  •   Community CDub    8 年前

    你不能直接这么做。你需要使用 std::remove erase myVector.erase(std::remove(myVector.begin(), myVector.end(), 8), myVec.end()); . 看到这个了吗 erasing elements from vector

        4
  •  1
  •   kometen    9 年前

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

    4

    10