首页 > 解决方案 > *(iterator) 和 *(++iterator) 在下面的 c++ 代码中是什么意思?

问题描述

为什么 set upperbound 中的 *(it) 返回 index ,而 set upperbound 中的 *(++it) 返回大于集合中任何值的值?

#include<bits/stdc++.h>
using namespace std;
int main() {
 set<int> s;
 s.insert(30);
 s.insert(25);
 int x=35;
 auto it = s.upper_bound(x);
 cout << *(it) << endl; //output: 2
 cout << *(++it) << endl;// output: 25
}

标签: c++iterator

解决方案


*(it)不返回索引。Ifit是一个引用集合成员的迭代器,则*(it)等价于*it()不需要)。因此,它访问集合的相应成员。如果it是一个过去的迭代器,则行为未定义。

*(++it) 首先递增it,然后访问相应的集合元素。所以

cout << *(++it) << endl;

给出相同的输出

++it;
cout << *it << endl;

it如果已经是一个过去的迭代器,或者如果增加它会给出一个结束的迭代器,它会给出未定义的行为。

在您的示例中,s.upper_bound(x)返回一个过去的迭代器,因为x它大于集合的任何成员。因此,代码中的两个输出语句都会给出未定义的行为。


推荐阅读