从字符串中删除字符的第一个和最后一个实例?

时间:2013-04-10 18:14:29

标签: c++

我假设以下内容无法编译,因为我正在混合正向和反向迭代器。为什么我不能这样混合它们?我怎样才能让它发挥作用?我想删除字符串的第一个和最后一个引号,但保留任何内部引号。

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(), '\"'));

5 个答案:

答案 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);
}

迭代器是有效的,但我认为上面的内容更具可读性。