0

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

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

5 回答 5

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() )

,例如,会给你最后一个 之后'.'的所有文本。当使用带有反向迭代器的查找结果作为结束标准时,您通常需要将其保存在变量中,并以某种方式“更正”它。

最后,您应该非常谨慎地使用两次查找的结果来定义范围,就像您在上面所做的那样。例如,如果你的文本中没有'"',你最终会得到相当于:

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

(这不是我的想法,所以不能保证,但它应该让你朝着正确的方向开始。)

于 2013-04-10T18:23:39.907 回答
1

如果要使用 reverse_itertators,请在它们上调用 .base() 到底层迭代器类型。例如

value.erase(find(value.begin(), value.end(), '\"'));
value.erase(find(value.rbegin(), value.rend(), '\"').base());

可能会成功。

于 2013-04-10T18:22:40.367 回答
0

我认为问题在于擦除需要一个正向迭代器,而不是一个反向迭代器。正如其他人指出的那样,您可以在 find 的结果上使用 .base() 来转换它们。

您也可以改用 find_end 。

于 2013-04-10T18:21:07.903 回答
0

你也可以使用

value.erase(0, value.find('\"') + 1);
value.erase(value.rfind('\"'), value.size());

假设字符串将始终包含至少两个"s

于 2013-04-10T18:26:57.300 回答
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);
}

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

于 2013-04-10T18:43:20.287 回答