列表函数max元素在c++中处理空容器

cedebl8k  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(171)

如果列表是空的,我该如何处理这种情况?我希望程序打印"不可能在空列表中找到最大值",但必须返回值...

template<typename T>
T max(const std::list<T>&l){
  
  std::list <T> l1=l;

  auto largest=l1.begin();

   for(auto it=begin(l1);it!=end(l1);++it){
     
     ++largest;
   
    if((*it)>(*largest)){
    
      largest=it;

     }
   }
   
   return *largest;
  }

我试着加上

template<typename T>
T max(const std::list<T>&l){
  if(l.empty()){

    std::cout<<"List is empty! "<<std::endl;
  }

  else{
  std::list <T> l1=l; 

  auto largest=l1.begin();

   for(auto it=begin(l1);it!=end(l1);++it){
     
     ++largest;
   
    if((*it)>(*largest)){
    
      largest=it;

     }
   }
   
   return *largest;
  }
}

在主. ccp文件中,要求输入元素类型double,因此,例如,如果我们输入'b',程序应该打印"List is empty!",并且应该只将输入的double放入容器中

nlejzf6q

nlejzf6q1#

解决这个问题的传统方法是不返回元素的副本,而是返回元素的迭代器。在空范围的情况下,可以返回范围末尾的迭代器。这是标准库std::max_elementstd::ranges::max_element处理这种情况的方法。
另一种方法是将返回类型 Package 在std::optional中,并在输入范围为空时返回std::nullopt
另一种方法是将空输入范围的情况视为调用方的一个错误。在C++中有许多方法可以处理错误情况:

  • 有一种方法可能是正确的,但通常不太安全,那就是根本不处理函数中的错误情况。记录使用空范围调用函数会导致未定义的行为(这是在你两次尝试的情况下会发生的事情)。在这种情况下,你必须通过检查之前的范围来处理这种情况,如果范围为空,则不调用函数,这就是标准库std::ranges::max处理(或者说,不处理)这种情况的方式。
  • 另一种方法是抛出异常。
  • 另一种方法是将返回类型 Package 在一元错误 Package 器中,例如为C++23建议的std::expected

注意,正如我在上面提到的例子,标准库已经提供了用于查找最大元素的函数模板,因此编写所描述的函数是相当不必要的。

相关问题