assign 函数(无论 的类型如何temp
)需要两个相同类型的迭代器。反向迭代器的类型与普通迭代器不同。base()
您可以使用反向迭代器上的函数获取底层正常迭代器,但要小心;它位于反向迭代器指向的位置之后。例如,如果你写
temp.assign( find( value.begin(), value.end(), '\"' ),
find( value.rbegin(), value.rend(), '\"').base() );
,尾随'"'
将成为结果字符串的一部分。
当您将结果用作开始迭代器时,这种特殊行为通常是您想要的:
std::string( std::find( fn.rbegin(), fn.rend(), '.' ), fn.end() )
,例如,会给你最后一个
之后'.'
的所有文本。当使用带有反向迭代器的查找结果作为结束标准时,您通常需要将其保存在变量中,并以某种方式“更正”它。
最后,您应该非常谨慎地使用两次查找的结果来定义范围,就像您在上面所做的那样。例如,如果你的文本中没有'"'
,你最终会得到相当于:
temp.assign( value.end(), value.begin() );
,这是行不通的。
编辑:
例如,如果您不想要这些'"'
字符,我认为以下应该可行:
// Returns an empty string if there are not two " chars.
std::string
extractQuoted( std::string const& original )
{
// end points to one after the last '"', or begin() if no '"'.
std::string::const_iterator end
= std::find( original.rbegin(), original.rend(), '"' ).base();
if ( end != original.begin() ) {
-- end; // Since we don't want the '"' in the final string
}
return std::string( std::find( original.begin(), end, '"' ), end );
}
(这不是我的想法,所以不能保证,但它应该让你朝着正确的方向开始。)