C 检索列表中现有或新项目的引用
C++ retrieve a reference to an existing or new item in a list
我当前在我的代码中添加一个函数,该函数基于某些密钥在列表中查找元素,然后将该元素返回作为参考。如果密钥尚未存在于列表中,它应该创建一个新元素,将其添加到列表的末尾,然后返回列表中该元素的引用,以便当我在函数之外编辑它时,它将被更改在列表中。最好的方法是什么?
目前我有以下内容:
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()在技术上是最后一个元素
- 不要解除结果,请直接使用指针
相关文章:
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 项目引用上的QT访问冲突
- 无法在 Visual Studio 中创建新项目
- 在Clion的新窗口中创建一个新项目
- CLION-创建新项目时的CMAKE错误
- 如何更改Visual Studio 2015中的默认新项目打开C 代码
- PowrProf.h的CallNtPowerInformation存在链接错误的新项目
- 是否将Visual Studio项目设置复制到新项目
- TensorFlow,Android Studio和Bazel:建立一个新项目
- CMAKE将新项目添加到解决方案中
- boost::variant 是否仍用于野外的新项目?
- Qt Creator在创建新项目时没有"Qt Gui Application"可供选择
- C 检索列表中现有或新项目的引用
- Eclipse CDT不为新项目生成符号
- 从CLI C++项目引用非托管C++项目
- 插入新项目后,如何获得布局的高度
- Rational软件架构师如何将.h和.cpp文件读取到新项目中
- 在 stl 映射中插入新项目时,将覆盖到第一个元素
- 从单元测试.EXE项目引用VC++.EXE项目中的类
- 创建新项目时未生成 helloworld.obj 文件