C 检索列表中现有或新项目的引用

C++ retrieve a reference to an existing or new item in a list

本文关键字:新项目 引用 检索 列表      更新时间:2023-10-16

我当前在我的代码中添加一个函数,该函数基于某些密钥在列表中查找元素,然后将该元素返回作为参考。如果密钥尚未存在于列表中,它应该创建一个新元素,将其添加到列表的末尾,然后返回列表中该元素的引用,以便当我在函数之外编辑它时,它将被更改在列表中。最好的方法是什么?

目前我有以下内容:

ElementType someElement;
getElementRefByKey (someList, someKey, someElement);
someElement.field = newField;
void getElementRefByKey (ListType &someList,
                         const int &someKey,
                         ElementType &someElement)
{
   for (ListType::iterator element_it = someList.begin();
        element_it != someList.end(); ++element_it)
   {
      if (element_it->key == someKey)
      {
         &someElement = &*element_it;
      }
   }
   ElementType newElement();
   newElement.key = someKey;
   someList.push_back(newElement);
   &someElement = &*someList.end()
}

我找到了最后一部分,我必须再次将最后一个元素作为参考有点丑陋,有没有更好的方法来执行此操作,或者这是做我描述的正确方法吗?在C 中是否有更好的练习?

非常感谢!

问候,Erik

编辑:正如评论中提到的,我对指针的用法在此示例中可能仍然是不正确的,这是第一稿,我试图让它起作用,但我仍然是C 的新手在指针使用方面挣扎。

edit2:有人提到使用地图。我知道这会更好,但是在这种情况下,我获得了一个列表和一个键,必须基于该键从该列表中编辑元素。另外,如果不存在键,则应生成带有该密钥的元素。有人向我建议,我应该使用一个可以找到或创建元素的函数并返回一个参考。

另外,它可以更改函数的返回类型和参数列表。

edit3:根据评论(这构建)修订:

ElementType* someElement = getElementRefByKey (someList, someKey);
someElement->field = newField;
ListType::iterator getElementRefByKey (ListType &someList,
                                       const int &someKey)
{
   for (ListType::iterator element_it = someList.begin();
        element_it != someList.end(); ++element_it)
   {
      if (element_it->key == someKey)
      {
         return element_it;
      }
   }
   ElementType newElement;
   newElement.key = someKey;
   someList.push_back(newElement);
   return someList.end() - 1;
}

edit4:最后一个问题:使用ElementType* someElement = func()代替ListType::iterator someElement = func()

是不好的做法

谢谢大家的帮助,我能够解决我的问题,下面的代码是最终功能,它可以按照我所获得的要求做我需要的工作:

ElementType* someElement = getElementRefByKey (someList, someKey);
someElement->field = newField;
ListType::iterator getElementRefByKey (ListType &someList,
                                       const int &someKey)
{
   for (ListType::iterator element_it = someList.begin();
        element_it != someList.end(); ++element_it)
   {
      if (element_it->key == someKey)
      {
         return element_it;
      }
   }
   ElementType newElement;
   newElement.key = someKey;
   someList.push_back(newElement);
   return someList.end() - 1;
}

回顾一下使它起作用的新见解:

  • 返回最后一个元素时返回迭代器本身添加
  • 返回end()迭代器减1,因为end()在技术上是最后一个元素
  • 不要解除结果,请直接使用指针