我假设以下内容无法编译,因为我正在混合正向和反向迭代器。为什么我不能这样混合它们?我怎样才能让它发挥作用?我想删除字符串的第一个和最后一个引号,但保留任何内部引号。
temp.assign(find(value.begin(), value.end(), '\"'), find(value.rbegin(), value.rend(), '\"'));
我甚至不能这样做。反向迭代器有什么意义?
value.erase(find(value.begin(), value.end(), '\"'));
value.erase(find(value.rbegin(), value.rend(), '\"'));
答案 0 :(得分:3)
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() )
例如,将在之后给出所有文本
'.'
。使用带有反向迭代器的find的结果时
作为最终标准,你通常需要保存它
变量,并以某种方式“纠正”它。
最后,你应该非常谨慎地使用
两个发现的结果定义一个范围,就像你上面做的那样。如果
你的文字中没有'"'
,例如,你最终会得到
相当于:
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 );
}
(这是我的头顶,所以没有保证,但它应该 让你开始朝着正确的方向前进。)
答案 1 :(得分:1)
如果要使用reverse_itertators,请将它们调用.base()到底层迭代器类型。 e.g。
value.erase(find(value.begin(), value.end(), '\"'));
value.erase(find(value.rbegin(), value.rend(), '\"').base());
可能会成功。
答案 2 :(得分:0)
我认为问题在于erase需要一个前向迭代器,而不是一个反向迭代器。正如其他人指出的那样,你可以在find的结果上使用.base()来转换它们。
您也可以使用find_end。
答案 3 :(得分:0)
您也可以使用
value.erase(0, value.find('\"') + 1);
value.erase(value.rfind('\"'), value.size());
假设字符串将始终包含至少两个"
s
答案 4 :(得分:0)
这个怎么样?
void stripLeadingAndTrailingQuotes(std::string& s) {
if (s[0] == '\"')
s.erase(0, 1);
size_t last = s.length() - 1;
if (s[last] == '\"')
s.erase(last, 1);
}
迭代器是有效的,但我认为上面的内容更具可读性。