【问题标题】:What is the difference in using forward and reverse iterators in find_if在 find_if 中使用正向和反向迭代器有什么区别
【发布时间】:2020-04-14 10:38:09
【问题描述】:

我有两个功能(书中的一个例子):

std::string trim_right(std::string s)
{
    s.erase(std::find_if(s.rbegin(), s.rend(), isalpha).base(),s.end() );

    return s;
} 
std::string trim_left(std::string s)
{
    s.erase(s.begin(),
        std::find_if(s.begin(), s.end(), isalpha));
    return s;
}

为什么在带有反向迭代器的函数trim_right 中我需要使用base(),但在带有正向迭代器的trim_left 中我不需要它?

【问题讨论】:

  • 因为strings erase() 具有接受iterator 和(C++11 起)const_iterator 的重载,不适用于reverse_iteratorconst_reverse_iterator。反向迭代器是根据“底层”迭代器实现的,它们的base() 成员可以访问该底层迭代器(例如,从reverse_iterator 获得相应的iterator)。

标签: c++ stl


【解决方案1】:

反向迭代器是常规迭代器上的适配器。而erase 重载只接受常规的、非反向的iteratorconst_iteratorreverse_it.base() 所做的是在 reverse_iterator 中解开适配的迭代器。所以这是一种从reverse_iterator 获取iterator 或从const_reverse_iterator 获取const_iterator 的方法。

【讨论】:

    猜你喜欢
    • 2012-02-10
    • 2020-04-29
    • 2013-11-18
    • 1970-01-01
    • 2019-05-16
    • 2020-05-04
    • 2010-10-29
    • 2017-03-03
    相关资源
    最近更新 更多