C++ C++;按值而不是按位置擦除矢量元素?

C++ C++;按值而不是按位置擦除矢量元素?,c++,vector,stl,erase,erase-remove-idiom,C++,Vector,Stl,Erase,Erase Remove Idiom,如果我想删除包含值“8”的元素,我想我会这样做: 5 9 2 8 0 7 因为这会删除第四个元素。但是,有没有办法根据值“8”删除元素?比如: 或者我只是需要遍历所有向量元素并测试它们的值吗?您不能直接这样做。您需要使用std::remove算法将要擦除的元素移动到向量的末尾,然后使用erase函数。类似于:myVector.erase(std::remove(myVector.begin(),myVector.end(),8),myVec.end())。有关更多详细信息,请参见此。您可以使用

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

5 9 2 8 0 7
因为这会删除第四个元素。但是,有没有办法根据值“8”删除元素?比如:


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

您不能直接这样做。您需要使用
std::remove
算法将要擦除的元素移动到向量的末尾,然后使用
erase
函数。类似于:
myVector.erase(std::remove(myVector.begin(),myVector.end(),8),myVec.end())。有关更多详细信息,请参见此。

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

myVector.eraseElementWhoseValueIs(8);
#包括
std::vector::iterator position=std::find(myVector.begin(),myVector.end(),8);
如果(position!=myVector.end())/==myVector.end()表示找不到元素
myVector.erase(位置);
取而代之的是:


#include.

Eric Niebler正在制定一个范围建议,其中一些演示了如何删除某些元素。删除8。创建一个新的向量

#include <algorithm>
...
vec.erase(std::remove(vec.begin(), vec.end(), 8), vec.end());
#包括
#包括
int main(int argc,char const*argv[]
{
std::向量vi{2,4,6,8,10};
用于(自动和i:vi){

std::cout@jak:看一下
remove()
:它移动所有不等于传递到范围开始的值的值
[begin,end)
。以问题中的示例为例,您会得到
5,9,2,0,7,7
。As
remove()
但是会将迭代器返回到新的结尾,
vec.erase()
可以删除过时的元素(即此处的第二个
7
),如果需要的话。为了使用remove()函数你必须
#包含
。否则它会给你一个疯狂的错误。请将它添加到回答中。链接到的文档页会给你提供这些信息。@GeorgFritzsche为什么你不能只回答他的问题而不给他发送链接?是的,它是O(n)该算法的愚蠢之处在于,remove在找到第一个匹配项时不会停止。保持对列表其余部分的比较是低效的。因此,如果向量中可能存在相同值的多个副本,这是很好的,但对于具有唯一值的向量的常见场景来说,这不是一个很好的答案。在这种情况下,std::find是一个更好的选择。如果您只希望该值出现一次,这是很好的。@TomášZato:或者只希望删除一次,这似乎是这个问题的情况。要删除所有值,请初始化
position=myVector.begin()
并将所有值括在
while(position!=myVector.end())
loop
Error C2676 binary'==':“action”没有定义此运算符,也没有在
xutility
中定义到预定义运算符可接受的类型的转换。实际上,我在这个示例中遇到的任何方法都会给我这个错误。@BenVoigt:你的问题太傲慢了-显然这个家伙无法回答,你应该回答什么e done就是创建一个涵盖你提到的所有情况的答案。@slashmais:哦,胡说,我的澄清问题很简单,不需要专家程序员回答。而且我不可能涵盖所有三种情况下“你想做什么?”的所有可能值。只针对“没有匹配元素”的情况可能的行为包括“无”、“抛出异常”、“返回错误”、“退出进程(可能通过
assert()
)”、“将消息记录到
std::cerr
”…甚至这些都不是详尽无遗的。不,问题的提问者需要说明错误处理策略,以及找不到匹配项是否是错误…QED的案例。我认为
myVector.eraseElementWhoseValueIs(8);
#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);
#include <algorithm>
...
vec.erase(std::remove(vec.begin(), vec.end(), 8), vec.end());
#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;
}