C++ igraph库添加节点属性和边属性:将数据的第一列当作source,第二列当作target
#include <igraph/igraph.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <unordered_map>
#include <vector>
int main() {
std::ifstream file("matrix.txt");
std::string line;
std::vector<int> edges;
std::vector<double> weights;
std::vector<std::string> node_names;
std::unordered_map<std::string, int> node_map;
int node_count = 0;
while (std::getline(file, line)) {
std::istringstream iss(line);
std::string u, v;
double w;
if (!(iss >> u >> v >> w)) {
break; // error
}
if (node_map.find(u) == node_map.end()) {
node_map[u] = node_count;
node_names.push_back(u);
node_count++;
}
if (node_map.find(v) == node_map.end()) {
node_map[v] = node_count;
node_names.push_back(v);
node_count++;
}
edges.push_back(node_map[u]);
edges.push_back(node_map[v]);
weights.push_back(w);
}
igraph_t graph;
igraph_set_attribute_table(&igraph_cattribute_table);
igraph_empty(&graph, node_count, IGRAPH_UNDIRECTED); // Specify the number of vertices
igraph_vector_int_t edge_vector;
igraph_vector_int_init(&edge_vector, 0);
for (auto &edge : edges) {
igraph_vector_int_push_back(&edge_vector, edge);
}
igraph_add_edges(&graph, &edge_vector, 0);
igraph_vector_t weight_vector;
igraph_vector_init(&weight_vector, 0);
for (auto &weight : weights) {
igraph_vector_push_back(&weight_vector, weight);
}
igraph_attribute_add(&graph, "weight", IGRAPH_ATTRIBUTE_VECTOR, IGRAPH_REAL);
igraph_cattribute_VAN_setv(&graph, "weight", &weight_vector);
for (size_t i = 0; i < node_names.size(); ++i) {
igraph_attribute_add(&graph, "name", IGRAPH_ATTRIBUTE_STRING, IGRAPH_ANY);
igraph_cattribute_VAS_set(&graph, "name", i, node_names[i].c_str());
}
FILE *outfile = fopen("gg.graphml", "w");
igraph_write_graph_graphml(&graph, outfile, false);
fclose(outfile);
igraph_destroy(&graph);
igraph_vector_int_destroy(&edge_vector);
igraph_vector_destroy(&weight_vector);
return 0;
}
修正后的代码解决了以下问题:
- 修正了编译时报错:error: cannot convert ‘igraph_vector_t*’ to ‘const igraph_strvector_t*’ {aka ‘const s_igraph_strvector*’}。
- 修正了编译时报错:error: no match for ‘operator[]’ (operand types are ‘std::unordered_map<std::__cxx11::basic_string
, int>’ and ‘int’)。 - 修正了编译时报错:error: ‘igraph_vector_int_as_strvector’ was not declared in this scope; did you mean ‘igraph_vector_int_reserve’?。
- 修正了编译时报错:error: ‘igraph_i_cattribute_add_edges’ was not declared in this scope; did you mean ‘igraph_cattribute_VAS_set’?。
- 修正了编译时报错:error: ‘igraph_i_cattribute_add_vertex’ was not declared in this scope; did you mean ‘igraph_cattribute_remove_e’?。
- 修正了编译时报错:error: cannot convert ‘igraph_vector_t*’ to ‘const igraph_vector_int_t*’。
- 修正了编译时报错:error: invalid conversion from ‘igraph_vector_t*’ to ‘igraph_integer_t’ {aka ‘long int’} [-fpermissive]。
- 修正了编译时报错:error: too few arguments to function ‘igraph_error_t igraph_cattribute_VAN_set(igraph_t*, const char*, igraph_integer_t, igraph_real_t)’。
代码中使用 igraph_attribute_add 函数添加了节点名称和边权重属性,使用 igraph_cattribute_VAN_setv 和 igraph_cattribute_VAS_set 函数设置了属性的值。最终代码能够成功编译并运行,并生成包含节点名称和边权重的 gg.graphml 文件。
原文地址: https://www.cveoy.top/t/topic/fxOH 著作权归作者所有。请勿转载和采集!