2015-03-01 2 views
-1

Я пытаюсь создать программу, которая считывает графики из файла .txt (что-то вроде http://pastebin.com/g4cgaHJB), а затем создает и помещает их в вектор. (Эта часть работы отлично)Копирование краев BOOST-граф C++

here ise the code: 
#include <iostream> 
#include <vector> 
#include <ctime> 
#include <set> 
#include <fstream> 
#include <string> 
#include <unordered_set> 
#include <cstdlib> 
#include <boost/algorithm/string/split.hpp> 
#include <boost/algorithm/string/classification.hpp> 
#include <boost/graph/adjacency_list.hpp> 
using namespace std; 
using namespace boost; 
using namespace boost::algorithm; 
/*********************************************/ 
//vertex 
struct VertexProperties 
{ 
    int id; 
    int label; 

    VertexProperties(){} 
    VertexProperties(unsigned i, unsigned l) : id(i), label(l) {} 
}; 

//edge 
struct EdgeProperties 
{ 
    unsigned id; 
    unsigned label; 
    EdgeProperties(){} 
    EdgeProperties(unsigned i, unsigned l) : id(i), label(l) {} 
}; 

//Graph 
struct GraphProperties 
{ 
    unsigned id; 
    unsigned label; 
    GraphProperties() {} 
    GraphProperties(unsigned i, unsigned l) : id(i), label(l) {} 
}; 


//adjency list 
typedef boost::adjacency_list< 
    boost::vecS, boost::vecS, boost::directedS, 
    VertexProperties, 
    EdgeProperties, 
    GraphProperties 
> Graph; 


//descriptors 
typedef boost::graph_traits<Graph>::vertex_descriptor vertex_t; 
typedef std::pair<boost::graph_traits<Graph>::edge_descriptor, bool> edge_t; 
//iterators 
typedef graph_traits<Graph>::vertex_iterator vertex_iter; 
typedef graph_traits<Graph>::edge_iterator edge_iter; 
/****************************************************************************/ 
//le seuil int seuil; 
std::vector<std::string> tokens; 

/* 
    programme principal 
*/ 
int main() 
{ 
    vector<Graph> dataG; // vector<graphes> * pointsdataG; 

    ifstream * file_reader= new ifstream("5.txt"); //flux d'entrée pour opérer sur les fichiers. 

    while (!file_reader->eof()) 
     { 
     string line; 

     file_reader->sync();//Synchronize input buffer 

     getline(*file_reader, line);//getline reads characters from an input stream and places them into a string 
     std::stringstream ss(line); //use a string buffer that contains a sequence of characters. 
     char lineType; 
     ss >> lineType; 
     if(lineType =='t') 
     { 
      char diez; 
      int gid; 
      ss >> diez >> gid; 
      Graph g(GraphProperties(gid,gid)); 
      dataG.push_back(g); 
     } else if (lineType == 'v') 
     { 
      assert(!dataG.empty());//evaluate the parameter. If this parameter is false it causes an assertion failure that terminates the program. 
      int vId, vLabel; 
      ss >> vId >> vLabel; 
      boost::add_vertex(VertexProperties(vId, vLabel), dataG[dataG.size()-1]); 
     } else if (lineType == 'e') 
     { 
      assert(!dataG.empty()); 
      int fromId, toId, vLabel; 
      ss >> fromId >> toId >> vLabel; 

      // Note that the EdgeProperty.id doesn't make sense with your input data 
      // as it only contains [vertexFrom vertexTo edgeData] 
      boost::add_edge(fromId, toId, 
          EdgeProperties(vLabel, vLabel), dataG[dataG.size()-1]); 
     } 
     } 


     cout<<"fin."<<endl; // fin du programme. 

     return 0; 
} 

Идея: Я пытаюсь itereate над графики, исходя из первого ребра (и создать график из него позволяет называть его testg), и тестирование, если этот график часто (Я буду тестировать подграф-изоморфизм между testg и каждым графом в vectorG-векторе, а затем подсчитаю, сколько раз будет истинно, если много времени тогда 2, поэтому testg часто), если testg часто, поэтому я добавлю к нему другой (и повторите тест подграфа-изоморфности), если testg не будет более частым, я удалю последний добавленный край (backtrack) и измените его на другой (и повторите тест подграфа-изоморфности). если добавить больше нечего, я скажу, что testg закрыт. и поместите его в вектор, позвольте ему закрыть его.

Я начал эту идею, делая это:

auto gr=dataG.at(0); 
     Graph testg();    
     edge_pair ep; 

     for (ep = edges(gr); ep.first != ep.second; ++ep.first) //ep edge number 
     { 
      vertex_t from = source(*ep.first, gr); 
      vertex_t to = target(*ep.first, gr); 
      edge_t edg = edge(from, to, gr); 
      boost::add_edge(from, to,testg); 
     } 

Но это не работает! здесь ошибки:

In function 'int main()' 
:workshop.cpp:123:42: error: no matching function for call to 'add_edge(vertex_t&, vertex_t&, Graph (&)())'boost: 
:add_edge(from, to, testg); 
workshop.cpp:123:42: note: candidates are 
:In file included from ./boost/graph/adjacency_list.hpp:246:0,from workshop.cpp:12 
:./boost/graph/detail/adjacency_list.hpp:707:5: note: template<class Config> std::pair<typename boost::directed_graph_helper<Config>::edge_descriptor, bool> boost::add_edge(typename Config::vertex_descriptor, typename Config::vertex_descriptor, const typename Config::edge_property_type&, boost::directed_graph_helper<Config>&)add_edge(typename Config: 
:vertex_descriptor u, 
./boost/graph/detail/adjacency_list.hpp:707:5: note: template argument deduction/substitution failed 
:workshop.cpp:123:42: note: candidate expects 4 arguments, 3 providedboost: 
:add_edge(from, to, testg); 
In file included from ./boost/graph/adjacency_list.hpp:246:0,from workshop.cpp:12 
:./boost/graph/detail/adjacency_list.hpp:727:5: note: template<class Config> std::pair<typename Config::edge_descriptor, bool> boost::add_edge(typename Config::vertex_descriptor, typename Config::vertex_descriptor, boost::directed_graph_helper<Config>&)add_edge(typename Config: 
:vertex_descriptor u, 
./boost/graph/detail/adjacency_list.hpp:727:5: note: template argument deduction/substitution failed 
:workshop.cpp:123:42: note: mismatched types 'boost::directed_graph_helper<Config>' and 'Graph() {aka boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, VertexProperties, EdgeProperties, GraphProperties>()}'boost: 
:add_edge(from, to, testg); 
In file included from ./boost/graph/adjacency_list.hpp:246:0,from workshop.cpp:12 
:./boost/graph/detail/adjacency_list.hpp:1045:5: note: template<class Config> std::pair<typename Config::edge_descriptor, bool> boost::add_edge(typename Config::vertex_descriptor, typename Config::vertex_descriptor, const typename Config::edge_property_type&, boost::undirected_graph_helper<C>&)add_edge(typename Config: 
:vertex_descriptor u, 
./boost/graph/detail/adjacency_list.hpp:1045:5: note: template argument deduction/substitution failed 
:workshop.cpp:123:42: note: candidate expects 4 arguments, 3 providedboost: 
:add_edge(from, to, testg); 
In file included from ./boost/graph/adjacency_list.hpp:246:0,from workshop.cpp:12 
:./boost/graph/detail/adjacency_list.hpp:1075:5: note: template<class Config> std::pair<typename Config::edge_descriptor, bool> boost::add_edge(typename Config::vertex_descriptor, typename Config::vertex_descriptor, boost::undirected_graph_helper<C>&)add_edge(typename Config: 
:vertex_descriptor u, 
./boost/graph/detail/adjacency_list.hpp:1075:5: note: template argument deduction/substitution failed 
:workshop.cpp:123:42: note: mismatched types 'boost::undirected_graph_helper<C>' and 'Graph() {aka boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, VertexProperties, EdgeProperties, GraphProperties>()}'boost: 
:add_edge(from, to, testg); 
In file included from ./boost/graph/adjacency_list.hpp:246:0,from workshop.cpp:12 
:./boost/graph/detail/adjacency_list.hpp:1473:5: note: template<class Config> std::pair<typename Config::edge_descriptor, bool> boost::add_edge(typename Config::vertex_descriptor, typename Config::vertex_descriptor, const typename Config::edge_property_type&, boost::bidirectional_graph_helper_with_property<Config>&)add_edge(typename Config: 
:vertex_descriptor u, 
./boost/graph/detail/adjacency_list.hpp:1473:5: note: template argument deduction/substitution failed 
:workshop.cpp:123:42: note: candidate expects 4 arguments, 3 providedboost: 
:add_edge(from, to, testg); 
In file included from ./boost/graph/adjacency_list.hpp:246:0,from workshop.cpp:12 
:./boost/graph/detail/adjacency_list.hpp:1503:5: note: template<class Config> std::pair<typename Config::edge_descriptor, bool> boost::add_edge(typename Config::vertex_descriptor, typename Config::vertex_descriptor, boost::bidirectional_graph_helper_with_property<Config>&)add_edge(typename Config: 
:vertex_descriptor u, 
./boost/graph/detail/adjacency_list.hpp:1503:5: note: template argument deduction/substitution failed 
:workshop.cpp:123:42: note: mismatched types 'boost::bidirectional_graph_helper_with_property<Config>' and 'Graph() {aka boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, VertexProperties, EdgeProperties, GraphProperties>()}'boost: 
:add_edge(from, to, testg); 
In file included from ./boost/graph/adjacency_list.hpp:246:0,from workshop.cpp:12 
:./boost/graph/detail/adjacency_list.hpp:2217:5: note: template<class Graph, class Config, class Base> std::pair<typename Config::edge_descriptor, bool> boost::add_edge(typename Config::vertex_descriptor, typename Config::vertex_descriptor,const typename Config::edge_property_type&, boost::vec_adj_list_impl<G, C, B>&)add_edge(typename Config: 
:vertex_descriptor u, 
./boost/graph/detail/adjacency_list.hpp:2217:5: note: template argument deduction/substitution failed 
:workshop.cpp:123:42: note: candidate expects 4 arguments, 3 providedboost: 
:add_edge(from, to, testg); 
In file included from ./boost/graph/adjacency_list.hpp:246:0,from workshop.cpp:12 
:./boost/graph/detail/adjacency_list.hpp:2231:5: note: template<class Graph, class Config, class Base> std::pair<typename Config::edge_descriptor, bool> boost::add_edge(typename Config::vertex_descriptor, typename Config::vertex_descriptor,boost::vec_adj_list_impl<G, C, B>&)add_edge(typename Config: 
:vertex_descriptor u, 
./boost/graph/detail/adjacency_list.hpp:2231:5: note: template argument deduction/substitution failed 
:workshop.cpp:123:42: note: mismatched types 'boost::vec_adj_list_impl<G, C, B>' and 'Graph() {aka boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, VertexProperties, EdgeProperties, GraphProperties>()}'boost::add_edge(from, to, testg); 
+0

"Но это не работает!". Впечатляет. Как вы думаете, что мы делаем по этому поводу? У нас нет ввода, у нас нет кода ошибки, мы не знаем ошибки. На самом деле ли это на самом деле печатать «не работает» на консоли? – sehe

+0

Извините, ошибки добавлены сейчас. –

ответ

2

Вы стать жертвой most vexing parse:

Graph testg(); 

объявляет функцию. Не чувствую себя плохо. Мне потребовалось некоторое время, чтобы это увидеть. оо

Просто напишите

Graph testg; 

или если вы хотите что-то, что почти всегда делает то, что вы имеете в виду:

Graph testg {}; 

Чувствуете плохо

  • using namespace там (особенно с std и boostdo внести значительные конфликты),
  • избыточных включает
  • безвозмездного использования new для потока файла ...
  • плохого использования eof() в цикле чтения
  • повторного использование dataG[dataG.size() -1] где data.back() может быть использованы
  • отсутствия обработки ошибок синтаксического анализа входного
  • сужая от gid (INT) беззнакового Int

Live On Coliru

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

using namespace boost; 

/*********************************************/ 
// vertex 
struct VertexProperties { 
    int id; 
    int label; 
    VertexProperties(unsigned i=0, unsigned l=0) : id(i), label(l) {} 
}; 

// edge 
struct EdgeProperties { 
    unsigned id; 
    unsigned label; 
    EdgeProperties(unsigned i=0, unsigned l=0) : id(i), label(l) {} 
}; 

// Graph 
struct GraphProperties { 
    unsigned id; 
    unsigned label; 
    GraphProperties(unsigned i=0, unsigned l=0) : id(i), label(l) {} 
}; 

// adjency list 
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, 
     VertexProperties, 
     EdgeProperties, 
     GraphProperties> Graph; 

// descriptors 
typedef boost::graph_traits<Graph>::vertex_descriptor vertex_descriptor; 
typedef std::pair<boost::graph_traits<Graph>::edge_descriptor, bool> edge_t; 
// iterators 
typedef graph_traits<Graph>::vertex_iterator vertex_iter; 
typedef graph_traits<Graph>::edge_iterator edge_iter; 

int main() { 
    std::vector<Graph> dataG; 

    std::ifstream file_reader("5.txt"); // flux d'entrée pour opérer sur les fichiers. 

    std::string line; 
    while (std::getline(file_reader, line)) { // getline reads characters from an input stream and places them into a string 

     char lineType; 

     std::stringstream ss(line); // use a string buffer that contains a sequence of characters. 
     if (ss >> lineType) switch (lineType) { 
      case 't': 
       { 
        char diez; 
        unsigned gid; 
        if (ss >> diez >> gid) { 
         dataG.emplace_back(GraphProperties { gid, gid }); 
        } 
        else throw std::runtime_error("Error parsing '" + line + "'"); 
       } 
       break; 
      case 'v': 
       { 
        assert(!dataG.empty()); 

        int vId, vLabel; 
        if (ss >> vId >> vLabel) { 
         boost::add_vertex(VertexProperties(vId, vLabel), dataG.back()); 
        } 
        else throw std::runtime_error("Error parsing '" + line + "'"); 
       } 
       break; 
      case 'e': 
       { 
        assert(!dataG.empty()); 

        int fromId, toId, vLabel; 
        if (ss >> fromId >> toId >> vLabel) { 
         // Note that the EdgeProperty.id doesn't make sense with your input data 
         // as it only contains [vertexFrom vertexTo edgeData] 
         boost::add_edge(fromId, toId, EdgeProperties(vLabel, vLabel), dataG.back()); 
        } 
        else throw std::runtime_error("Error parsing '" + line + "'"); 
       } 
       break; 
     } else 
     { 
      // ignoring empty line 
     } 
    } 

    if (!dataG.empty()) { 
     auto const& gr = dataG.front(); // no copy 
     Graph testg; 

     for (auto ep = edges(gr); ep.first != ep.second; ++ep.first) // ep edge number 
     { 
      vertex_descriptor from = source(*ep.first, gr); 
      vertex_descriptor to = target(*ep.first, gr); 

      boost::add_edge(from, to, testg); 
     } 
    } 
    std::cout << "fin." << std::endl; // fin du programme. 
} 
+0

Я попытался это http://pastebin.com/J6mfCTem и сказать 'прекратить окликнул бросать экземпляр«станд :: runtime_error» , что(): разбор ошибок«T # 0» ABANDON (ядро сбрасывали) ' –

+0

Похоже, что ошибка описана самостоятельно. Он не выполняет синтаксический анализ строки, содержащей 't # 0' (и вы забыли инициализировать' start') – sehe

+0

Ah. Я забыл положить перерывы в коммутаторе, как плохо. Пожалуйста, в следующий раз, по крайней мере, попробуйте добавить используемый вход ... Слишком сложно сделать какую-либо полезную отладку от вашего имени без нее. – sehe

Смежные вопросы