c++ - *(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
}
解决方案
*(it)
不返回索引。Ifit
是一个引用集合成员的迭代器,则*(it)
等价于*it
(()
不需要)。因此,它访问集合的相应成员。如果it
是一个过去的迭代器,则行为未定义。
*(++it)
首先递增it
,然后访问相应的集合元素。所以
cout << *(++it) << endl;
给出相同的输出
++it;
cout << *it << endl;
it
如果已经是一个过去的迭代器,或者如果增加它会给出一个结束的迭代器,它会给出未定义的行为。
在您的示例中,s.upper_bound(x)
返回一个过去的迭代器,因为x
它大于集合的任何成员。因此,代码中的两个输出语句都会给出未定义的行为。
推荐阅读
- laravel - 如何在 Laravel 上建立用户表和其他没有主键的关系
- python - 如何在 Python 3.6 中从文件中导入方法
- c# - 未找到与请求 URI 'https://my-resource.search.windows.net/indexes('my-index')?api-version=2017-11-11 匹配的 HTTP 资源
- javascript - 想在nodejs(javascript)中创建一个数组数组
- sql - 如何根据另一列 SQL Server 2014 中的数据更新一列上的值
- react-native - 使用 props 控制 modal
- google-cast - 需要开发chromecast内置设备的教程
- c# - 是否可以限制ac#winforms应用程序的内存访问
- webpack - style-loader 如何与 css-loader 一起使用?
- c# - 如何使用正则表达式匹配路由部分中的部分url?WebAPI .NET 核心 2.2