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

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

我目前正在向我的代码添加一个函数,该函数根据某个键在列表中查找一个元素,然后 return将该元素作为参考。如果键还没有出现在列表中,它应该创建一个新元素,将它添加到列表的末尾,然后 return 对列表中该元素的引用,这样当我在函数之外编辑它时它将在列表中更改。执行此操作的最佳方法是什么?

目前我有以下内容:

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++ 中是否有被认为更好的替代方案?

非常感谢!

此致, 埃里克

编辑:正如评论中提到的,我在这个例子中对指针的使用可能仍然不正确,这是初稿,我正在努力让它工作,但我对 c++ 还是很陌生,我仍在为指针的使用而苦苦挣扎。

EDIT2:有些人提到了地图的使用。我知道这样会更好,但在这种情况下,我得到了一个列表和一个键,并且必须根据该键编辑该列表中的一个元素。此外,如果密钥不存在,则应生成具有该密钥的元素。有人向我建议我应该使用一个函数来查找或创建元素和 return 一个引用,这样需要编辑元素的代码就不必担心从列表中获取它或创建它并将其放入它在列表中。

此外,允许更改函数的 return 类型和参数列表。

编辑3: 根据评论修改(此版本):

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;
}

编辑4: 最后一个问题:使用 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;
}

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

  • return 当 returning 最后一个元素时的迭代器本身 已添加
  • return end() 迭代器减 1,因为 end() 在技术上是在最后一个之后 元素
  • 不要解引用结果,直接使用指针