C ++检索对列表

时间:2015-05-09 00:43:16

标签: c++ list reference iterator

我目前在我的代码中添加了一个函数,该函数根据某个键查找列表中的元素,然后将该元素作为引用返回。如果列中尚未存在该键,则应创建一个新元素,将其添加到列表的末尾,然后在列表中返回对该元素的引用,这样当我在函数外部编辑它时,它将被更改在列表中。最好的方法是什么?

目前我有以下内容:

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

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

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()是不好的做法?

1 个答案:

答案 0 :(得分:0)

谢谢大家的帮助,我能够解决我的问题,下面的代码片段是我需要它完成我所需要的最终功能:

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()在技术上是最后一个 元件
  • 不取消引用结果,直接使用指针