Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将std::prev与字符串_iterator.begin()一起使用有多不安全?_C++_Iterator_Undefined Behavior - Fatal编程技术网

C++ 将std::prev与字符串_iterator.begin()一起使用有多不安全?

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

我有这段代码。此函数不复制相邻的重复字符。它只保留其中一个字符。为了缩短时间,我决定将std::prev与iterator.begin()一起使用。我知道这是一个非常糟糕的练习,我来自C,但是C++中有一些不同。未定义的行为几乎不存在。告诉我,伙计们。我可以很容易地改变我的方法。如果你有更快的方法,我也很感兴趣

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时会更加残忍。我认为它之所以称为
未定义行为
。这是不可预测的