首页 > 解决方案 > 通过给定的 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++ 新手。我感谢任何帮助修复我的功能。

标签: c++list

解决方案


我实际上不明白你的问题是什么。我运行您的代码并正常按索引取回顶点。这是代码:

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

推荐阅读