gpt4 book ai didi

c++ - 为什么 erase-remove 习语不适用于反向迭代器

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:18 27 4
gpt4 key购买 nike

我的目标是尝试解决这个问题:Removing all empty elements in a vector from end .使用 erase-remove 习语。

想法是在给定的 std::vector<std::string> 中删除从末尾开始的所有空元素(等于空白)字符串。当找到非空元素时,应停止删除元素。

例子:

vec = { " ", "B", " ", "D", "E", " ", " ", " " };

删除后:

vec = { " ", "B", " ", "D", "E"};

这是我尝试过的解决方案:

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>

int main()
{
std::vector<std::string> vec = { " ", "B", " ", "D", "E", " ", " ", " " };

bool notStop = true;
auto removeSpaceFromLast = [&](const std::string& element)-> bool
{
if(element != " " ) notStop = false;
return ( (element == " ") && (notStop) );
};

vec.erase(
std::remove_if(vec.rbegin(), vec.rend(), removeSpaceFromLast),
vec.rend() );

std::copy(vec.begin(), vec.end(), std::ostream_iterator<std::string>(std::cout,","));

return 0;
}

这给了我一个错误:

no matching function for call to  std::vector<std::__cxx11::basic_string<char> >::erase(std::reverse_iterator<__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > > >, std::vector<std::__cxx11::basic_string<char> >::reverse_iterator)'|

然后我读到关于 std::vector::erase() 的工作这里:Does vector::erase not work with reverse iterators?

并更改了代码:

vec.erase(
std::remove_if(vec.rbegin().base(), vec.rend().base(), removeSpaceFromLast),
vec.rend().base() );

这次它编译了,但给了我输出 = 原始 vector 。

谁能解释一下:

  1. 为什么会这样?
  2. 如果可能的话,我们该如何解决?

最佳答案

您错放了对 base() 的调用。 remove_if 会将它找到的所有从尾部开始的空间移动到 vector 的开始部分(因为如果使用前向迭代器,它将移动从头开始找到的空间移动到尾部)并返回迭代器指向要删除序列的结束位置(即要保留的空间的开始,因为我们反转了迭代器的含义),即:

" ", " ", " ", "B", " ", "D", "E"

然后,您必须从头开始删除,即 rend().base()

vec.erase(vec.rend().base(), 
std::remove_if(vec.rbegin(), vec.rend(), removeSpaceFromLast).base()
);

关于c++ - 为什么 erase-remove 习语不适用于反向迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50113086/

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