使用迭代器时使用 ++ 和 +1 的区别
Difference between using ++ and +1 when use iterator
我们都知道,如果我们想增加迭代器,我们可以使用运算符"++"或使用"+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));
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- 迭代器和标量对象之间的未定义行为有什么区别吗?
- const_iterator<T>和迭代器<常量T>有什么区别?
- 使用迭代器时使用 ++ 和 +1 的区别
- 映射::擦除:按键擦除或迭代器擦除之间的区别
- 容器末端和指向内部项的迭代器之间的区别.C++
- 迭代器和back_insert_iterator有什么区别?
- regex_token_iterator和regex_迭代器有什么区别
- 提升单遍迭代器和前向遍历迭代器有什么区别?
- “迭代器”和“对元素的引用”之间的区别
- c++在解引用迭代器时x++与x = x+ 1的区别
- 迭代器中reduce和reduce的区别
- 哨兵和结束迭代器有什么区别?
- c++中迭代器的前缀和后缀自增操作符重载实现的区别
- STL 容器基于范围的循环中的迭代器语法有什么区别
- 迭代器和反向迭代器的区别