gpt4 book ai didi

c++ - 如何查找 boost 图中是否存在顶点?

转载 作者:太空狗 更新时间:2023-10-29 21:13:09 25 4
gpt4 key购买 nike

我有一个 boost 图(带有捆绑属性)。我想查找图中是否已经存在具有特定值的顶点。有人可以帮我弄这个吗?在这里,我展示了我现有代码的 MWE:

Live on Coliru

#include <iostream>
#include <string>
#include <vector>
#include <boost/graph/adjacency_list.hpp>

struct mytuple
{
int e1;
int e2;
int s;

bool operator==(const mytuple& a) const
{
return ((e1 == a.e1) && (e2 == a.e2) && (s == a.s));
}
};

struct MyVertex {
std::string comments;
int field1;
mytuple value;
MyVertex(std::string comments = std::string()) : comments(comments) {}
};

struct MyEdge {
std::string label;
MyEdge(std::string label = std::string()) : label(label) {}
};

// Define the graph with the vertex as a mytuple and the vertices container as a vector
using MyTree = boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, MyVertex, MyEdge>;
using Vertex = boost::graph_traits<MyTree>::vertex_descriptor; // Define Vertex
using VertexItr = boost::graph_traits<MyTree>::vertex_iterator; // Define Vertex iterator
using Edge = std::pair<boost::graph_traits<MyTree>::edge_descriptor, bool>; // Define Edge
using EdgeItr = boost::graph_traits<MyTree>::edge_iterator; // Define Edge Iterator

int main()
{
MyTree mytree;

Vertex v1 = boost::add_vertex(mytree);
mytree[v1].value = {1, 1, 1};

Vertex v2 = boost::add_vertex(mytree);
mytree[v2].value = {2, 2, 2};

Vertex v3 = boost::add_vertex(mytree);
mytree[v3].value = {3, 3, 3};

// Perhaps add some edges

std::cout << "I want to find if my graph has a vertex containing the value {1, 1, 1}";
// mytree.findvertex(with value {1, 1, 1})
}

最佳答案

#include <iostream>
#include <string>
#include <vector>
#include <boost/graph/adjacency_list.hpp>


struct mytuple
{
int e1;
int e2;
int s;

bool operator==(const mytuple& a) const
{
return ((e1 == a.e1) && (e2 == a.e2) && (s == a.s));
}
};

struct MyVertex {
std::string comments;
int field1;
mytuple value;
MyVertex(std::string comments = std::string()) : comments(comments) {}
};

struct MyEdge {
std::string label;
MyEdge(std::string label = std::string()) : label(label) {}
};

// Define the graph with the vertex as a mytuple and the vertices container as a vector
using MyTree = boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, MyVertex, MyEdge>;
using Vertex = boost::graph_traits<MyTree>::vertex_descriptor; // Define Vertex
using VertexItr = boost::graph_traits<MyTree>::vertex_iterator; // Define Vertex iterator
using Edge = std::pair<boost::graph_traits<MyTree>::edge_descriptor, bool>; // Define Edge
using EdgeItr = boost::graph_traits<MyTree>::edge_iterator; // Define Edge Iterator

VertexItr findvertex(const MyTree& g, const mytuple& value){
VertexItr vi, vi_end;
for (boost::tie(vi, vi_end) = vertices(g); vi != vi_end; ++vi) {
if(g[*vi].value == value) return vi;
}
return vi_end;
}

int main()
{
MyTree mytree;

Vertex v1 = boost::add_vertex(mytree);
mytree[v1].value = {1, 1, 1};
mytree[v1].comments = "I am the one you seek";

Vertex v2 = boost::add_vertex(mytree);
mytree[v2].value = {2, 2, 2};

Vertex v3 = boost::add_vertex(mytree);
mytree[v3].value = {3, 3, 3};

// Perhaps add some edges

std::cout << "I want to find if my graph has a vertex containing the value {1, 1, 1}\n";
mytuple tuple = { 1,1,1};
const auto iter = findvertex(mytree, tuple);
const auto theEnd = boost::vertices(mytree).second;
if(iter != theEnd){
std::cout << "'ere I be: " << mytree[*iter].comments << '\n';
}
else{
std::cout << "failed to find tuple\n";
}
}

使用 g++ graph.cpp -std=c++11 -o graph.o -l boost_graph 编译产生输出

I want to find if my graph has a vertex containing the value {1, 1, 1}
'ere I be: I am the one you seek

关于c++ - 如何查找 boost 图中是否存在顶点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45357757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com