请检查注释的代码行:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int>numbers{1,2,3,4,5,6,7,8};
vector<int>::iterator it, beg=numbers.begin(), end=numbers.end();
for(it=beg; it!=end; it++){
cout<<*it++<<endl; //THIS LINE PRINTS 1 3 5 7
}
return 0;
}
我正在阅读迭代器并尝试一些事情。该行似乎打印了it
引用的元素,然后递增it
。实际上它产生的结果与:
cout<<*it<<endl;
it++;
我没有清楚地解释清楚,真正的问题是:你能在这样的迭代器上执行2次操作吗?
为什么*(it+1)
与*(it++)
不同?
感谢。
答案 0 :(得分:6)
你正在增加你的迭代器两次。一旦进入for循环“ header ”本身:
for(it=beg; it!=end; it++){
一旦进入循环
cout<<*it++<<endl;
因此你正在跳过元素。第二行应该是:
cout<<*it<<endl;
此外,*(it ++)与*(it + 1)不同,因为后缀运算符++返回原始值(而前缀返回递增的值)。更重要的是,*(它+ 1)实际上并没有增加迭代器,使用++。让我们用一个例子来说明:
如果我有一个指向索引0处元素的迭代器:
*(it++) // will print element at index 0 and move the iterator forward to index 1
*(++it) // will move the iterator at index 1 and print element at index 1
*(it+1) // will print element at index 1, the iterator does not "move"
您可以在行动here中看到这一点。
答案 1 :(得分:0)
it++
表示“增加它,并在它增加之前返回它的值”。这只是postfix ++
运算符的语义。 (整数表现相同)。它在*(it+1)
中不起作用,因为现在你没有增加迭代器,只是查看下一个值。 (it+1)
根本不会改变it
,而它会改变++或++。
示例:
#include <iostream>
int main() {
int a = 0;
std::cout << (a++) << "\n"; // Postfix ++, that you used. Prints 0
std::cout << a << "\n"; // but now a is 1.
std::cout << (++a) << "\n"; // Prefix ++, increases a and returns the increased value => Prints 2
std::cout << a << "\n"; // Prints 2
}
Ideone链接:http://ideone.com/QvkdlX
是的,你的迭代器增加了两次,一次在循环中,一次在打印时。你真的想要吗?
答案 2 :(得分:0)
在打印“cout&lt;&lt; * it ++;”时,您正在递增迭代器。我会像这样打印它“cout&lt;&lt; * it;”并在for-loop中使用前缀表示法“++ it”递增迭代器。由于迭代器很大并且保存与容器相关的各种数据,因此这将使计算机不必存储迭代器直到下一行执行。