gpt4 book ai didi

c++ - 如果 `vec.erase(find(...) )` 应该以相反的顺序开始搜索,则删除带有 `find` 的元素

转载 作者:太空狗 更新时间:2023-10-29 20:37:12 25 4
gpt4 key购买 nike

我有一个由独特 (!) 元素组成的 vector ,我想删除一个具有特定值的元素。这个元素也很可能接近 vector 的末尾。因此我想从最后开始寻找这个元素。

我认为这应该可行,但它不可行。

vec.erase( find(crbegin(vec), crend(vec), value) ); //does not work

编译器sais(缩写):

error: no matching function for call to 'std::vector<unsigned int>::erase(std::reverse_iterator<__gnu_cxx::__normal_iterator<unsigned int*, std::vector<unsigned int> > >)'

and also

note: no known conversion for argument 1 from 'std::reverse_iterator<__gnu_cxx::__normal_iterator<unsigned int*, std::vector<unsigned int> > >' to 'std::vector<unsigned int>::const_iterator {aka __gnu_cxx::__normal_iterator<const unsigned int*, std::vector<unsigned int> >}'

如果我不使用反向迭代器,它就可以工作(因此编译器注释):

vec.erase( find(cbegin(vec), cend(vec), value) ); //works

我怎么知道 find 应该从末尾开始搜索 value

编辑:我知道, vector 包含搜索到的元素。

最佳答案

您不能告诉 vector 使用它不知道的某种迭代器来删除元素。您需要将反向迭代器变回 std::vector::iterator。使用 std::reverse_iterator::base() 执行此操作.但是,这会给您一个差一错误,因为反向迭代器必须进行一些移位以解决在范围开头没有“结束”迭代器的情况。使用 std::prev考虑到这一点:

vec.erase(std::prev(find(crbegin(vec), crend(vec), value).base()));

请记住,这假设元素已找到。你的代码已经这样做了,你的编辑说你是故意假设的,所以我不是在引入一个新问题,但实际上你应该在尝试删除它之前检查是否找到了元素。像(未经测试):

auto foundCRIt = std::find(std::crbegin(vec), std::crend(vec), value);
if (foundCRIt == std::crend(vec)) {
std::cerr << "Not found!\n";
return;
}
vec.erase(std::prev(foundCRIt.base()));

关于c++ - 如果 `vec.erase(find(...) )` 应该以相反的顺序开始搜索,则删除带有 `find` 的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35674461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com