Вернуть объект из списка по заданному идентификатору - PullRequest
0 голосов
/ 11 ноября 2019

Для реализации алгоритма соответствия кардинальности Эдмонда в C ++ я создал новую структуру для вершин графа, в которой хранится некоторая дополнительная информация, необходимая для алгоритма, и функцию, которая возвращает вершину путем ввода ее идентификатора. Однако он не выполняет то, что должен.

Я хочу, чтобы функция getVertex (ED :: NodeId x, std :: list vertecies) возвращала вершину в списке vertecies с идентификаторомх (который является первым параметром 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 ++. Я благодарен за любую помощь в исправлении моей функции.

1 Ответ

0 голосов
/ 11 ноября 2019

На самом деле я не понимаю, в чем ваша проблема. Я запускаю ваш код и получаю вершины по индексу как обычно. Вот код:

#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

Возможно, я использую неправильные типы или аргументы, но это работает ...
Но это будет лучшеиспользовать для каждого цикла. Он работает так же, но гораздо безопаснее:

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
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...