【发布时间】: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 中我不需要它?
【问题讨论】:
-
因为
stringserase()具有接受iterator和(C++11 起)const_iterator的重载,不适用于reverse_iterator和const_reverse_iterator。反向迭代器是根据“底层”迭代器实现的,它们的base()成员可以访问该底层迭代器(例如,从reverse_iterator获得相应的iterator)。