使用迭代器时使用 ++ 和 +1 的区别

Difference between using ++ and +1 when use iterator

本文关键字:区别 迭代器      更新时间:2023-10-16

我们都知道,如果我们想增加迭代器,我们可以使用运算符"++"或使用"+1"。+++1有区别吗?

现在,我运行这个程序:

#include <iostream>
#include <string>
#include <iterator>
using namespace std;
int Str(string &s, string::iterator it)
{
    if(it == s.end())
        return 0;
    else 
    { 
        return (1 + Str(s,it++)); // Wrong line of code.When using "it + 1" 
                                  //programme could get right result but 
                                  //when using "it++" programme could not
                                  // get right result
    }
}
int main(int argc, char* argv[])
{
    string s;
    cout << "enter: ";
    cin >> s;
    string::iterator it = s.begin();
    int i = Str(s,it);
    cout << "str= " << i << endl;
    return 0;
}

我使用迭代器作为函数参数。

并非所有迭代器都可以执行+1 .只有随机访问迭代器才能执行此操作。不过,所有迭代器都可以做++。但是++有两个版本.

那么你的错误是i++计算i+1但返回以前的值。你想要的是 ++i ,返回新的递增迭代器。

问题是在

return (1 + Str(s, it++));

您使用的是 Postfix 增量运算符,该运算符执行增量,但返回迭代器在增量之前的状态。您可以将其更改为

return (1 + Str(s, ++it));

这应该产生所需的结果。请注意,it + 1仅适用于随机访问迭代器。它在您的情况下也做同样的事情,但您可以尝试对正在使用的迭代器强制实施尽可能少的约束,例如,当您将容器更改为与双向迭代器一起使用的容器时,希望您的代码仍然有效。因此,我建议++it一起去。

请注意,还有函数模板std::next ,它递增给定的迭代器。它的可读性也很强

return (1 + Str(s, std::next(it));