从向量中删除元素并保持顺序 - 需要更好的方法

3

我正在尝试从C ++的向量中删除一个元素。在下面的代码中,我正在从数字列表中删除大于10的元素。我使用嵌套循环进行删除。是否有更好或更简单的方法来完成相同的操作。

// removing an element from vector preserving order
#include <iostream>
#include <vector>
using namespace std;
int main() {
    vector<int> v {3,2,9,82,2,5,4,3,4,6};
    for (int i=0; i < v.size(); i++) {
        if (v[i] > 10) { // remove element > 10
            while (i < v.size()) {
                v[i] = v[i+1];
                i ++;
            }
        }
    }
    v.pop_back();
    for (int i=0; i < v.size(); i++) {
        cout << v[i] << "|";
    }
    return 0;
}

那基本上是最好的方法。如果速度太慢,请考虑使用不同的结构,比如二叉树。 - Patashu
std::remove_if,不需要自己写。 - chris
你不能像这样使用 v.remove(i); 吗? - Anthony Raimondo
1
@JavaNewb,您可以使用v.erase(iteratorOfI)来缩短代码,但是它完全可以被remove_if替代。 - chris
1
向量的好处在于,它们不是数组。它们可以为您做一些事情。文档是您的朋友:http://en.cppreference.com/w/cpp/container/vector - Ed S.
1个回答

4

您可能想要查看 std::remove_if

bool is_higher_than_10(int i) { return i > 10; }
std::remove_if(v.begin(), v.end(), is_higher_than_10);

既然学无止境,那就看看Chris和Benjamin Lindley的评论以及擦除-删除习语(谢谢你们)。

v.erase(std::remove_if(v.begin(), v.end(), is_higher_than_10), v.end());

2
你可能想在那里添加一个 v.erase()。Lambda 表达式也很适合这种情况。 - chris
如果我没记错的话,vector::erase需要精确的迭代器作为参数 - 而OP想要删除任何大于10的值(在一个显然未排序的向量中)。在这种情况下,我认为std::remove_if是一个更方便的选择。 - Nbr44
2
@Nbr44:Chris 的意思不是用 erase 代替 remove_if。他的意思是,除了使用 remove_if,还要使用 erase。现在你这样写,无法知道移除后还剩下多少元素。容器的大小也没有改变。你需要捕获 remove_if 的返回值,并将其(连同 v.end())传递给 erase 函数。 - Benjamin Lindley
@Nbr44,查找一下erase-remove惯用语。 - chris
我一定会仔细看的。 :) - Nbr44

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接