C++ 将std::prev与字符串_iterator.begin()一起使用有多不安全?
我有这段代码。此函数不复制相邻的重复字符。它只保留其中一个字符。为了缩短时间,我决定将std::prev与iterator.begin()一起使用。我知道这是一个非常糟糕的练习,我来自C,但是C++中有一些不同。未定义的行为几乎不存在。告诉我,伙计们。我可以很容易地改变我的方法。如果你有更快的方法,我也很感兴趣C++ 将std::prev与字符串_iterator.begin()一起使用有多不安全?,c++,iterator,undefined-behavior,C++,Iterator,Undefined Behavior,我有这段代码。此函数不复制相邻的重复字符。它只保留其中一个字符。为了缩短时间,我决定将std::prev与iterator.begin()一起使用。我知道这是一个非常糟糕的练习,我来自C,但是C++中有一些不同。未定义的行为几乎不存在。告诉我,伙计们。我可以很容易地改变我的方法。如果你有更快的方法,我也很感兴趣 string suppDouble(const string& str) { if (str.size() <= 1) return str; strin
string suppDouble(const string& str)
{
if (str.size() <= 1) return str;
string token;
for (auto it = str.cbegin(); it != str.cend(); it++)
{
if (*(std::prev(it)) != *it) token.push_back(*it);
}
return token;
}
string suppDouble(常量字符串和str)
{
如果(str.size()在C++类指针中考虑迭代器。如果不仔细检查,它可以指向不属于你的数据。它导致<>代码>:ST::OXORY OFFROWE 异常
< P>在C++指针中考虑迭代器。如果不仔细检查边界,它可以指向不属于你的数据。它导致<代码> STD::OXOFY范围-< /C。ode>异常std::prev
在您的情况下有效地执行了it-1
。但是,递减begin迭代器是未定义的行为
:
如果计算--container.begin(),则begin迭代器不可递减,且行为未定义
这意味着,您的第一个循环迭代已经完成
请注意,有一个std算法可以完全满足您的要求:
从范围[first,last]中的每个连续的等效元素组中消除除第一个元素以外的所有元素,并为该范围的新逻辑端返回一个结束迭代器
std::prev
在您的情况下有效地执行了it-1
。但是,减少begin迭代器是未定义的行为
:
如果计算--container.begin(),则begin迭代器不可递减,且行为未定义
这意味着,您的第一个循环迭代已经完成
请注意,有一个std算法可以完全满足您的要求:
从范围[first,last]中的每个连续的等效元素组中消除除第一个元素以外的所有元素,并为该范围的新逻辑端返回一个结束迭代器
这是纯UB。在begin
之前你不能访问元素。这是纯UB。在begin
之前你不能访问元素。确切地说,我没有想到unique。我很愚蠢,因为我没有想到unique。我很愚蠢,我很清楚这意味着什么,但有了这段代码,我从来没有遇到过未定义的行为或异常。这就是我问你们的原因。很明显,这是独一无二的。问题解决方案我从来没有遇到过未定义的行为。你们认为自己没有遇到过,但你们的代码确实有UB。也许,你们肯定是对的,但我希望你们确定它是UB。在C中,有UB的情况下要残酷得多。我认为这就是为什么它调用undefined的原因行为
。这是不可预测的。我完全知道这意味着什么,但有了这段代码,我从来没有遇到过未定义的行为或异常。这就是为什么我问你们的原因。很明显,这是唯一的。问题解决我从来没有遇到过未定义的行为。你们认为你们没有遇到过,但你们的代码确实有UB。也许,你们是对的当然,但我想确定它是UB。在C中,有UB时会更加残忍。我认为它之所以称为未定义行为
。这是不可预测的