【问题标题】:Return False or Value C++返回 False 或值 C++
【发布时间】:2014-05-02 05:52:50
【问题描述】:

我有一个 avl 树,其中包含包含字符串标识符的对象。

我让用户输入一个字符串,然后我想解析树以查看该用户字符串是否与树标识符中的任何对象匹配。如果没有具有与用户字符串匹配的标识符的对象,我想创建一个将标识符设置为用户字符串的对象。如果带有标识符的对象与用户的输入匹配,我想将该对象返回给用户。目前我有两个函数,一个返回布尔值,如果对象已经存在于树中,另一个返回对象到控制台,如果它已经存在于树中。有没有办法将这两个步骤组合成一个功能?我正在寻找类似的东西:

if(...) // the item exists in the tree
{
    //return the object
}
else
{
    avltreeObject.insert(user_string);
}

【问题讨论】:

  • 为什么不在else的情况下返回新插入的对象呢?如果您还需要返回一个状态(找到或插入),要么有一个布尔返回值并使用传递的对象引用参数并设置它,或者你可以返回一个std::pair,状态为first,对象为@ 987654328@.
  • 如果对象不存在,通常检索函数返回null,所以你可以调用它并根据它来区分进一步的处理。
  • 你可能会遵循 std::map 实现
  • 为什么我觉得这个问题是相关的? stackoverflow.com/questions/23417592/…
  • 在这种情况下,我也会返回新插入的值。在我需要值类的“空”值的情况下,我通常使用 Boost.Optional:boost.org/doc/libs/1_55_0/libs/optional/doc/html/index.html

标签: c++ avl-tree


【解决方案1】:

将返回类型设为std::pair<bool, Object>

if(/*the item exists in the tree*/)
{
   return std::make_pair(false, object);
}
else
{
   avltreeObject.insert(user_string);
   return std::make_pair(true, object);
}

【讨论】:

    【解决方案2】:

    类似这样的:

    Object obj = avltreeObject.retrieve(user_string);
    if( object != 0 ){
        return obj;
    } else {
        avltreeObject.insert(user_string);
        return avltreeObject.retrieve(user_string);
    }
    

    insert 函数可能会返回新创建的对象,因此可以对此进行改进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-17
      • 2014-07-05
      • 1970-01-01
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-20
      相关资源
      最近更新 更多