【问题标题】:Referencing max/min int in set for c++为 c++ 引用 set 中的 max/min int
【发布时间】:2014-02-22 20:00:43
【问题描述】:

假设我有以下使用 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();

【问题讨论】:

  • a.end() 不是最后一个元素。
  • *a.begin()*a.rbegin()(注意取消引用)。
  • 函数 begin() 将迭代器返回到集合的第一个元素。

标签: c++ function set


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    min = *a.begin();
    

    接收最小元素和

    max = *a.rbegin();
    

    接收最大值。

    max = *a.end();
    

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

    【讨论】:

      【解决方案3】:

      正如其他人所说,必须取消引用迭代器(如 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-23
        • 1970-01-01
        • 2016-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        相关资源
        最近更新 更多