引用 c++ 集中的最大值/最小值

Referencing max/min int in set for c++

本文关键字:最小值 最大值 c++ 集中 引用      更新时间:2023-10-16

假设我有以下使用 c++ 集合的示例:

set <int> a;
for (int i = 0; i <10; i++){
//Assume i is a random number
a.insert(i);
}

如何找到上面显示的集合示例的最大值和最小值?理想情况下,我认为以下内容可以工作,但它给出了以下错误:

error: cannot convert 'std::_Rb_tree_const_iterator<int>' to 'int' in assignment

我正在使用以下函数来尝试获取最大值/最小值:

min = a.begin();
max = a.end();

首先,beginend 返回迭代器,您需要对其执行间接寻址 ( * ) 以获得它们指向的元素。

其次,end返回过去结束的迭代器,因此实际上并不引用最后一个元素。您可以改用反向开始迭代器。

min = *a.begin();
max = *a.rbegin();

a.begin()a.end()是迭代器,而不是元素。用

min = *a.begin();

接收最小元素和

max = *a.rbegin();

接收最大值。

max = *a.end();

将不起作用,因为它指向最后一个元素之后的下一个元素。所以它会返回垃圾。

正如其他人所说,迭代器(如begin()rbegin()返回的迭代器)必须取消引用才能检索它指向的值。

但是,在取消引用之前,必须检查迭代器的有效性。例如,在空向量上,begin()将返回一个超出范围的迭代器(指向最后一个位置之后的一个位置)。

因此,更谨慎的方法是:

// assuming a is a vector<int>
vector<int>::const_iterator p = a.cbegin(); // or use auto to hide iterator type
int min_val = p != a.cend()? (*p) : (INT_MAX); // if empty, yield a special value like INT_MAX