【问题标题】:How to fix the crash happening during conditional copying如何修复条件复制期间发生的崩溃
【发布时间】:2019-06-10 07:06:50
【问题描述】:

我正在尝试使用 std::copy_if 仅将字符串 's' 的字母字符存储到我的字符队列中,但在复制语句期间出现崩溃。

std::string s{"Love"};
std::deque<char> dr;
std::deque<char>::reverse_iterator itr =std::copy_if(s.cbegin(),s.cend   (),dr.rbegin(),[](char c){return isalpha(c);});

program.exe 停止工作

【问题讨论】:

  • dr 有足够的空间容纳这么多字符吗?

标签: c++ data-structures stl


【解决方案1】:

可能的问题是您的deque 不够大,无法容纳您正在复制的字符。 std::copy_if 不会调整 deque 的大小(怎么可能,因为它只有一个迭代器可以使用)?通常的答案是使用一种称为std::front_insert_iterator 的特殊迭代器,它会在复制元素时调用push_front 来增大deque。您可以使用函数std::front_inserter 创建一个std::front_insert_iterator。像这样

auto itr = 
    std::copy_if(s.cbegin(), s.cend(),
        std::front_inserter(dr), 
        [](char c){return isalpha(c);});

PS 还有对应的std::back_insert_iterator 和函数std::back_inserter 比较常用。但是std::front_inserter 适合您的情况,因为当您将字符插入deque 时,您似乎想要反转字符序列。

【讨论】:

  • @JeJo 抱歉,您将从我的代码中获取常规迭代器,而不是反向迭代器。我已经解决了。如果这是一个问题,您可以从返回的迭代器构造一个 reverse_iterator。
  • @JeJo 抱歉,再次更正。当我不测试编译发布的代码时会发生这种情况。从std::copy_if 返回的迭代器将与传递给第三个参数的迭代器类型相同。因此,在上述情况下,它将是std::front_insert_iterator&lt;std::deque&lt;char&gt;&gt;。需要从 std::copy_if 返回的迭代器是很不寻常的,但如果你这样做了,那么最简单的方法是将其声明为 auto 并让编译器找出类型。
  • 感谢您的澄清。恕我直言,您是 OP 需要的聪明答案。因此删除我的。如果您可以将上述评论添加到您的答案中,那可能会很好。 ;)
  • @john 有什么方法可以在不初始化的情况下指定双端队列的大小。我还真没见过这样的案例。 PS:我对编程很陌生
  • @AyushJindal 是的,只需在创建双端队列时指定大小即可。例如std::deque&lt;char&gt; dr(10); 创建一个大小为 10 的双端队列。JeJo 在他现在删除的答案中说了同样的话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 2018-01-18
  • 2013-03-03
  • 2020-06-28
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
相关资源
最近更新 更多