이 코드 조각은 내 신경을 상당히 고갈시키고 있습니다. 잠시 동안 디버깅을 해본 적이 있는데, C++에 녹슬 었는지 믿을 수 없습니다.구조 전달 목록 항목이 사라지고 있습니까?
몇 가지 간단한 알고리즘을 실행하기 위해 그래프를 모델링하려고하지만 잘 작동하지 않는 것 같습니다. 모든 정점에는 자신의 이웃에 대한 전달 목록이 포함되어 있지만 요소를 삽입 할 때 분명히 존재합니다. 인쇄 기능에 도달 할 때까지는; 이때 전달 목록은 비어 있습니다. 범위 지정이 .. 어떤 행운 중 하나 .. 기존 정점에 대한 참조를 유지하기 위해 그래프를 수정
#include <iostream>
#include <vector>
#include <set>
#include <forward_list>
#include <fstream>
using namespace std;
typedef struct Vertex Vertex;
struct Vertex {
unsigned id;
forward_list<Vertex*>_next;
bool operator < (const Vertex &other) const { return id < other.id; };
};
typedef set<Vertex> Graph;
typedef vector<Vertex*> Index;
typedef pair<unsigned, unsigned> Edge;
typedef forward_list<Vertex*> Neighbors;
// Function: process_line()
// Purpose: process a specific line from the file.
// Params: line to process
Edge process_line(string line){
unsigned vertex_from;
unsigned vertex_to;
int idx = line.find(" ");
vertex_from = (unsigned)stoul(line.substr(0, idx));
vertex_to = (unsigned)stoul(line.substr(idx+1, line.length()));
return make_pair(vertex_from, vertex_to);
}
// Function: load_graph()
// Purpose: load graph from file in relation
// Params: path, and reference to graph and index
bool load_graph(string file_path, Graph &graph, Index &index){
string line;
ifstream file(file_path);
bool foundEmptyLine = false;
if(file.is_open()){
while(getline(file, line)){
if(line.empty()){
foundEmptyLine = true;
continue;
}
if(!foundEmptyLine){
// processing vertexes
Vertex *vertex = new Vertex;
vertex->id = stoul(line);
graph.insert(*vertex);
index.emplace_back(vertex);
}else{
//Processing relations
Edge edge = process_line(line);
Vertex* neighbor = index.at(edge.second);
Vertex* source = index.at(edge.first);
// Lookup edge in index
source->_next.emplace_front(neighbor);
// ITEMS PRESENT! <----------------------
}
}
file.close();
}else{
cout << "Unable to open " << file_path;
return false;
}
return true;
}
void print_graph(Graph &graph){
for(Graph::iterator it = graph.begin(); it != graph.end(); ++it){
Neighbors neighs = it->_next;
cout << "Node: " << it->id << " neighbors: " neighs.empty();
cout << endl;
}
}
// Entry point.
int main() {
Graph graph;
Index index;
load_graph("graph_1.txt", graph, index);
print_graph(graph);
}
const value_type
다시 한 번 여러분의 노력에 감사드립니다 대신value_type
에 반복자를 반환 할 수 있습니다. 세트가 요소를 벡터와 대칭으로 복사한다는 사실을 놓쳤습니다. 따라서 집합에 참조를 삽입하면 모든 것이 효과적이었습니다. 제 작업 버전에서도 const_iterator 팁을 사용했습니다. – Iso인덱스에 벡터을 사용하고 그래프에 를 설정하고 인접 라우터에 대해 forward_list 을 설정하는 것이 좋습니다. –
overseas