c++ - 通过给定的 id 从列表中取回对象
问题描述
为了在 C++ 中实现 Edmond 的基数匹配算法,我为图的顶点创建了一个新结构,它存储了算法所需的更多信息,以及一个函数,它通过输入顶点的 id 来获取顶点。但是,它没有做它应该做的事情。
我希望函数 getVertex(ED::NodeId x, std::list vertecies) 以 id x (这是第一个参数 v)返回列表顶点中的顶点。相关代码如下:
struct vertex
{
ED::NodeId v;
ED::NodeId m;
ED::NodeId f;
ED::NodeId r;
int scanned;
void setM(vertex neigh);
void setF(vertex neigh);
void setR(vertex neigh);
void setScanned(int scan);
} vrtex;
vertex getVertex(ED::NodeId x, std::list<vertex> vertecies)
{
for (std::list<vertex>::iterator it = vertecies.begin(); it!=vertecies.end(); ++it)
{
if(it->v == x)
{
return (vertex) * it;
}
}
printf("No element with id %i found.", x);
return createVertex(0); //If there is no suche node id in vertecies
}
如果我插入getVertex(vert.m,vertecies),我总是取回顶点vert,而不是vert.m索引的顶点,我觉得这与指针有关,我不完全了解它的作用,因为我是 C++ 新手。我感谢任何帮助修复我的功能。
解决方案
我实际上不明白你的问题是什么。我运行您的代码并正常按索引取回顶点。这是代码:
#include <iostream>
#include <list>
namespace ED
{
typedef int NodeId;
}
struct vertex
{
ED::NodeId v;
ED::NodeId m;
ED::NodeId f;
ED::NodeId r;
int scanned;
void setM(vertex neigh);
void setF(vertex neigh);
void setR(vertex neigh);
void setScanned(int scan);
} vrtex;
vertex getVertex(ED::NodeId x, std::list<vertex> vertecies)
{
for (std::list<vertex>::iterator it = vertecies.begin(); it!=vertecies.end(); ++it)
{
if(it->v == x)
{
printf("Element found!\n");
return (vertex) * it;
}
}
printf("No element with id %i found.", x);
return vertex(); // If there is no suche node id in vertecies
}
int main()
{
std::list<vertex> vertices =
{
{0,0,0,0,0},
{1,0,0,0,0},
{2,0,0,0,228},
{3,0,0,0,0}
};
printf("%d\n", vertices.size());
vertex e = getVertex(2, vertices);
printf("Element.scanned = %d\n", e.scanned);
vertex vert = {0,2,0,0,0};
e = getVertex(vert.m, vertices);
printf("Element.scanned = %d\n", e.scanned);
}
和输出:
[DDRDmakar@localhost New Folder]$ g++ test.cpp && ./a.out
4
Element found!
Element.scanned = 228
Element found!
Element.scanned = 228
也许我使用了错误的类型或参数,但它有效......
但使用 for-each 循环会更好。它的工作方式相同,但更安全:
vertex getVertex(ED::NodeId x, std::list<vertex> vertecies)
{
for (const auto &e : vertecies)
{
if(e.v == x)
{
printf("Element found!\n");
return e;
}
}
printf("No element with id %i found.", x);
return vertex(); // If there is no suche node id in vertecies
}
推荐阅读
- wpf - 如何在 Wpf 中为 Kendo RadTreeView 添加或(覆盖默认值)悬停和选择样式
- ios - Swift:更优雅的方式来编写这个数组映射?
- reactjs - 在 Firebase 数据库更改并返回其初始状态后,反应状态未(重新)设置
- reactjs - 自己的 dataTable 的 sortFunction
- json - 如何为嵌套在结构内的接口显示同一级别的json?
- sql - 表之间的多对多关系
- r - 具有排名值的 R-ggplot 图中位数
- python - 如何绘制类似正态分布的直方图?
- eclipse - 将 NAT 表中的列大小更改为首选项后如何保存列顺序和重新调整大小的列的宽度
- amazon-web-services - 使用 AWS Lambda 的计划作业