2016-12-13 5 views
2

Я прочитал boost docs, чтобы выяснить, как использовать свойство_map.не удалось использовать свойство_map и compress_sparse_row_graph в библиотеке форматирования

на основе

// Property map accessors 
template<typename PropertyTag> 
property_map<compressed_sparse_row_graph, PropertyTag>::type 
get(PropertyTag, compressed_sparse_row_graph& g) 

Я написал следующий код:

#include <boost/graph/graph_traits.hpp> 
#include <boost/graph/adjacency_list.hpp> 
#include <boost/graph/compressed_sparse_row_graph.hpp> 
#include <boost/utility.hpp> 

typedef boost::compressed_sparse_row_graph<boost::bidirectionalS, boost::no_property, boost::property<boost::edge_weight_t, int> > AdjGraph; 
typedef typename boost::property_map<AdjGraph, boost::edge_weight_t>::type WeightMap; 
class data { 
    WeightMap weight; 
    data() 
    { 
     std::vector<std::pair<int, int> > edges; 
     std::vector<int> edgesAttr; 
     boost::shared_ptr<AdjGraph> adjGraph; 
     adjGraph = boost::shared_ptr<AdjGraph>(new AdjGraph(boost::edges_are_unsorted_multi_pass, edges.begin(), edges.end(), edgesAttr.begin(), 0)); 
     weight = boost::get(boost::edge_weight, *adjGraph); 
    } 
}; 

int main() { return 0; } 

Но ошибки были сообщены, когда я пытался скомпилирован.

Я изменил

weight = boost::get(boost::edge_weight, *adjGraph); 

быть

auto tmp = boost::get(boost::edge_weight, *adjGraph); 

И он компилирует хорошо.

Но как «вес» не должна быть статической переменной, «автоматический вес» является неприемлемым.

Я хочу знать, какой тип "вес" должно быть. Я попробовал «typeinfo» и «typeid(). Name()», но выход нечитабелен.

Хотя я имею в виду 1,61 документы, я на самом деле, используя 1,58 1.58 docs

+0

Что вы пытаетесь сделать? Связать карту свойств с графом? Помогает ли это? http://stackoverflow.com/questions/12501188/iterating-through-edge-weights-of-a-const-boostgraph – doctorlove

+0

@doctorlove, это не он – sehe

+1

Другой трюк: используйте 'struct {} _ = expression;' и компилятор сообщение об ошибке будет точно детализировать тип этого выражения. Обратите внимание, однако, что только документация предоставит вам переносимый способ формулировать этот тип, как у вас уже было (WeightMap) – sehe

ответ

3

Я хочу знать, какой тип «вес» должен быть

Тип является WeightMap. У вас уже есть это правильно. Вы решаете неправильную проблему. Это просто компилирует

WeightMap weight = boost::get(boost::edge_weight, *adjGraph); 

Тогда что является проблема?

WeightMap - нестандартная конструкция. Как и все карты свойств, это просто облегченная, недорогая копия «ссылки» на фактические данные (в этом случае внутри модели графа).

Таким образом, нет оснований хранить его в элементе или делиться им с внешним миром.

На более существенном уровне, поскольку карты свойств обычно (и, конечно же, в данном случае) ссылаются на базовый объект, его время жизни действительно только в том случае, если основной граф.

Поэтому не имеет смысла держать карту веса в качестве члена, если вы также сохранить общий указатель на графике в предыдущем элементе:

Live On Wandbox

#include <boost/graph/graph_traits.hpp> 
#include <boost/graph/compressed_sparse_row_graph.hpp> 
#include <boost/utility.hpp> 

typedef boost::compressed_sparse_row_graph<boost::bidirectionalS, boost::no_property, boost::property<boost::edge_weight_t, int> > AdjGraph; 
typedef typename boost::property_map<AdjGraph, boost::edge_weight_t>::type WeightMap; 

class data { 
    boost::shared_ptr<AdjGraph> adjGraph; 
    WeightMap weight; 
    public: 
    data(std::vector<std::pair<int, int> > const& edges, std::vector<int> const& edgesAttr) 
     : adjGraph (boost::shared_ptr<AdjGraph>(new AdjGraph(boost::edges_are_unsorted_multi_pass, edges.begin(), edges.end(), edgesAttr.begin(), 0))), 
      weight(boost::get(boost::edge_weight, *adjGraph)) 
    { 
    } 
}; 

int main() { 
    std::vector<std::pair<int, int> > edges; 
    std::vector<int> edgesAttr; 

    data d(edges, edgesAttr); 
} 
+0

Хотя я упоминаю 1.61 документы в описании проблемы, я фактически использую 1.58. В [boost 1.58 doc] (http://www.boost.org/doc/libs/1_58_0/libs/graph/doc/compressed_sparse_row.html) описание функции get совпадает с 1.61. Проблема вызвана ошибками буферизации. Спасибо за помощь! –

+0

Пожалуйста, напишите ответ, где вы описываете проблему и решение. Мой ответ четко объясняет проблему в вашем примере_ и показывает, как ее исправить (это имеет смысл, мы не можем отвечать на вопросы, которые не были заданы) – sehe

+0

Поскольку я новичок в stackoverflow, я не знаю много о том, что мне нужно делать. Вы мне очень помогаете. Спасибо за ваш совет. –

1

После исправления проблемы инициализации вес предупреждения будут отображаться, если компиляция с повышением 1.58 и -std = gnu ++ 11: wandbox

In file included from /usr/local/boost-1.59.0/include/boost/smart_ptr/shared_ptr.hpp:28:0, 
       from /usr/local/boost-1.59.0/include/boost/shared_ptr.hpp:17, 
       from /usr/local/boost-1.59.0/include/boost/property_map/vector_property_map.hpp:14, 
       from /usr/local/boost-1.59.0/include/boost/property_map/property_map.hpp:600, 
       from /usr/local/boost-1.59.0/include/boost/graph/properties.hpp:19, 
       from /usr/local/boost-1.59.0/include/boost/graph/compressed_sparse_row_graph.hpp:26, 
       from prog.cc:2: 
/usr/local/boost-1.59.0/include/boost/smart_ptr/detail/shared_count.hpp:396:33: warning: 'template<class> class std::auto_ptr' is deprecated [-Wdeprecated-declarations] 
    explicit shared_count(std::auto_ptr<Y> & r): pi_(new sp_counted_impl_p<Y>(r.get())) 
           ^~~~~~~~ 
In file included from /usr/local/gcc-head/include/c++/7.0.0/memory:80:0, 
       from /usr/local/boost-1.59.0/include/boost/config/no_tr1/memory.hpp:21, 
       from /usr/local/boost-1.59.0/include/boost/smart_ptr/shared_ptr.hpp:23, 
       from /usr/local/boost-1.59.0/include/boost/shared_ptr.hpp:17, 
       from /usr/local/boost-1.59.0/include/boost/property_map/vector_property_map.hpp:14, 
       from /usr/local/boost-1.59.0/include/boost/property_map/property_map.hpp:600, 
       from /usr/local/boost-1.59.0/include/boost/graph/properties.hpp:19, 
       from /usr/local/boost-1.59.0/include/boost/graph/compressed_sparse_row_graph.hpp:26, 
       from prog.cc:2: 
/usr/local/gcc-head/include/c++/7.0.0/bits/unique_ptr.h:51:28: note: declared here 
    template<typename> class auto_ptr; 
          ^~~~~~~~ 
In file included from /usr/local/boost-1.59.0/include/boost/shared_ptr.hpp:17:0, 
       from /usr/local/boost-1.59.0/include/boost/property_map/vector_property_map.hpp:14, 
       from /usr/local/boost-1.59.0/include/boost/property_map/property_map.hpp:600, 
       from /usr/local/boost-1.59.0/include/boost/graph/properties.hpp:19, 
       from /usr/local/boost-1.59.0/include/boost/graph/compressed_sparse_row_graph.hpp:26, 
       from prog.cc:2: 
/usr/local/boost-1.59.0/include/boost/smart_ptr/shared_ptr.hpp:249:65: warning: 'template<class> class std::auto_ptr' is deprecated [-Wdeprecated-declarations] 
template< class T, class R > struct sp_enable_if_auto_ptr< std::auto_ptr<T>, R > 
                   ^~~~~~~~ 
In file included from /usr/local/gcc-head/include/c++/7.0.0/memory:80:0, 
       from /usr/local/boost-1.59.0/include/boost/config/no_tr1/memory.hpp:21, 
       from /usr/local/boost-1.59.0/include/boost/smart_ptr/shared_ptr.hpp:23, 
       from /usr/local/boost-1.59.0/include/boost/shared_ptr.hpp:17, 
       from /usr/local/boost-1.59.0/include/boost/property_map/vector_property_map.hpp:14, 
       from /usr/local/boost-1.59.0/include/boost/property_map/property_map.hpp:600, 
       from /usr/local/boost-1.59.0/include/boost/graph/properties.hpp:19, 
       from /usr/local/boost-1.59.0/include/boost/graph/compressed_sparse_row_graph.hpp:26, 
       from prog.cc:2: 
/usr/local/gcc-head/include/c++/7.0.0/bits/unique_ptr.h:51:28: note: declared here 
    template<typename> class auto_ptr; 
          ^~~~~~~~ 
In file included from /usr/local/boost-1.59.0/include/boost/shared_ptr.hpp:17:0, 
       from /usr/local/boost-1.59.0/include/boost/property_map/vector_property_map.hpp:14, 
       from /usr/local/boost-1.59.0/include/boost/property_map/property_map.hpp:600, 
       from /usr/local/boost-1.59.0/include/boost/graph/properties.hpp:19, 
       from /usr/local/boost-1.59.0/include/boost/graph/compressed_sparse_row_graph.hpp:26, 
       from prog.cc:2: 
/usr/local/boost-1.59.0/include/boost/smart_ptr/shared_ptr.hpp:448:31: warning: 'template<class> class std::auto_ptr' is deprecated [-Wdeprecated-declarations] 
    explicit shared_ptr(std::auto_ptr<Y> & r): px(r.get()), pn() 
           ^~~~~~~~ 
In file included from /usr/local/gcc-head/include/c++/7.0.0/memory:80:0, 
       from /usr/local/boost-1.59.0/include/boost/config/no_tr1/memory.hpp:21, 
       from /usr/local/boost-1.59.0/include/boost/smart_ptr/shared_ptr.hpp:23, 
       from /usr/local/boost-1.59.0/include/boost/shared_ptr.hpp:17, 
       from /usr/local/boost-1.59.0/include/boost/property_map/vector_property_map.hpp:14, 
       from /usr/local/boost-1.59.0/include/boost/property_map/property_map.hpp:600, 
       from /usr/local/boost-1.59.0/include/boost/graph/properties.hpp:19, 
       from /usr/local/boost-1.59.0/include/boost/graph/compressed_sparse_row_graph.hpp:26, 
       from prog.cc:2: 
/usr/local/gcc-head/include/c++/7.0.0/bits/unique_ptr.h:51:28: note: declared here 
    template<typename> class auto_ptr; 
          ^~~~~~~~ 
In file included from /usr/local/boost-1.59.0/include/boost/shared_ptr.hpp:17:0, 
       from /usr/local/boost-1.59.0/include/boost/property_map/vector_property_map.hpp:14, 
       from /usr/local/boost-1.59.0/include/boost/property_map/property_map.hpp:600, 
       from /usr/local/boost-1.59.0/include/boost/graph/properties.hpp:19, 
       from /usr/local/boost-1.59.0/include/boost/graph/compressed_sparse_row_graph.hpp:26, 
       from prog.cc:2: 
/usr/local/boost-1.59.0/include/boost/smart_ptr/shared_ptr.hpp:461:22: warning: 'template<class> class std::auto_ptr' is deprecated [-Wdeprecated-declarations] 
    shared_ptr(std::auto_ptr<Y> && r): px(r.get()), pn() 
         ^~~~~~~~ 
In file included from /usr/local/gcc-head/include/c++/7.0.0/memory:80:0, 
       from /usr/local/boost-1.59.0/include/boost/config/no_tr1/memory.hpp:21, 
       from /usr/local/boost-1.59.0/include/boost/smart_ptr/shared_ptr.hpp:23, 
       from /usr/local/boost-1.59.0/include/boost/shared_ptr.hpp:17, 
       from /usr/local/boost-1.59.0/include/boost/property_map/vector_property_map.hpp:14, 
       from /usr/local/boost-1.59.0/include/boost/property_map/property_map.hpp:600, 
       from /usr/local/boost-1.59.0/include/boost/graph/properties.hpp:19, 
       from /usr/local/boost-1.59.0/include/boost/graph/compressed_sparse_row_graph.hpp:26, 
       from prog.cc:2: 
/usr/local/gcc-head/include/c++/7.0.0/bits/unique_ptr.h:51:28: note: declared here 
    template<typename> class auto_ptr; 
          ^~~~~~~~ 
In file included from /usr/local/boost-1.59.0/include/boost/shared_ptr.hpp:17:0, 
       from /usr/local/boost-1.59.0/include/boost/property_map/vector_property_map.hpp:14, 
       from /usr/local/boost-1.59.0/include/boost/property_map/property_map.hpp:600, 
       from /usr/local/boost-1.59.0/include/boost/graph/properties.hpp:19, 
       from /usr/local/boost-1.59.0/include/boost/graph/compressed_sparse_row_graph.hpp:26, 
       from prog.cc:2: 
/usr/local/boost-1.59.0/include/boost/smart_ptr/shared_ptr.hpp:538:34: warning: 'template<class> class std::auto_ptr' is deprecated [-Wdeprecated-declarations] 
    shared_ptr & operator=(std::auto_ptr<Y> & r) 
            ^~~~~~~~ 
In file included from /usr/local/gcc-head/include/c++/7.0.0/memory:80:0, 
       from /usr/local/boost-1.59.0/include/boost/config/no_tr1/memory.hpp:21, 
       from /usr/local/boost-1.59.0/include/boost/smart_ptr/shared_ptr.hpp:23, 
       from /usr/local/boost-1.59.0/include/boost/shared_ptr.hpp:17, 
       from /usr/local/boost-1.59.0/include/boost/property_map/vector_property_map.hpp:14, 
       from /usr/local/boost-1.59.0/include/boost/property_map/property_map.hpp:600, 
       from /usr/local/boost-1.59.0/include/boost/graph/properties.hpp:19, 
       from /usr/local/boost-1.59.0/include/boost/graph/compressed_sparse_row_graph.hpp:26, 
       from prog.cc:2: 
/usr/local/gcc-head/include/c++/7.0.0/bits/unique_ptr.h:51:28: note: declared here 
    template<typename> class auto_ptr; 
          ^~~~~~~~ 
In file included from /usr/local/boost-1.59.0/include/boost/shared_ptr.hpp:17:0, 
       from /usr/local/boost-1.59.0/include/boost/property_map/vector_property_map.hpp:14, 
       from /usr/local/boost-1.59.0/include/boost/property_map/property_map.hpp:600, 
       from /usr/local/boost-1.59.0/include/boost/graph/properties.hpp:19, 
       from /usr/local/boost-1.59.0/include/boost/graph/compressed_sparse_row_graph.hpp:26, 
       from prog.cc:2: 
/usr/local/boost-1.59.0/include/boost/smart_ptr/shared_ptr.hpp:547:34: warning: 'template<class> class std::auto_ptr' is deprecated [-Wdeprecated-declarations] 
    shared_ptr & operator=(std::auto_ptr<Y> && r) 
            ^~~~~~~~ 
In file included from /usr/local/gcc-head/include/c++/7.0.0/memory:80:0, 
       from /usr/local/boost-1.59.0/include/boost/config/no_tr1/memory.hpp:21, 
       from /usr/local/boost-1.59.0/include/boost/smart_ptr/shared_ptr.hpp:23, 
       from /usr/local/boost-1.59.0/include/boost/shared_ptr.hpp:17, 
       from /usr/local/boost-1.59.0/include/boost/property_map/vector_property_map.hpp:14, 
       from /usr/local/boost-1.59.0/include/boost/property_map/property_map.hpp:600, 
       from /usr/local/boost-1.59.0/include/boost/graph/properties.hpp:19, 
       from /usr/local/boost-1.59.0/include/boost/graph/compressed_sparse_row_graph.hpp:26, 
       from prog.cc:2: 
/usr/local/gcc-head/include/c++/7.0.0/bits/unique_ptr.h:51:28: note: declared here 
    template<typename> class auto_ptr; 
          ^~~~~~~~ 
In file included from /usr/local/boost-1.59.0/include/boost/shared_ptr.hpp:17:0, 
       from /usr/local/boost-1.59.0/include/boost/property_map/vector_property_map.hpp:14, 
       from /usr/local/boost-1.59.0/include/boost/property_map/property_map.hpp:600, 
       from /usr/local/boost-1.59.0/include/boost/graph/properties.hpp:19, 
       from /usr/local/boost-1.59.0/include/boost/graph/compressed_sparse_row_graph.hpp:26, 
       from prog.cc:2: 
/usr/local/boost-1.59.0/include/boost/smart_ptr/shared_ptr.hpp: In member function 'boost::shared_ptr<T>& boost::shared_ptr<T>::operator=(std::auto_ptr<_Up>&&)': 
/usr/local/boost-1.59.0/include/boost/smart_ptr/shared_ptr.hpp:549:38: warning: 'template<class> class std::auto_ptr' is deprecated [-Wdeprecated-declarations] 
     this_type(static_cast< std::auto_ptr<Y> && >(r)).swap(*this); 
             ^~~~~~~~ 
In file included from /usr/local/gcc-head/include/c++/7.0.0/memory:80:0, 
       from /usr/local/boost-1.59.0/include/boost/config/no_tr1/memory.hpp:21, 
       from /usr/local/boost-1.59.0/include/boost/smart_ptr/shared_ptr.hpp:23, 
       from /usr/local/boost-1.59.0/include/boost/shared_ptr.hpp:17, 
       from /usr/local/boost-1.59.0/include/boost/property_map/vector_property_map.hpp:14, 
       from /usr/local/boost-1.59.0/include/boost/property_map/property_map.hpp:600, 
       from /usr/local/boost-1.59.0/include/boost/graph/properties.hpp:19, 
       from /usr/local/boost-1.59.0/include/boost/graph/compressed_sparse_row_graph.hpp:26, 
       from prog.cc:2: 
/usr/local/gcc-head/include/c++/7.0.0/bits/unique_ptr.h:51:28: note: declared here 
    template<typename> class auto_ptr; 
          ^~~~~~~~ 

Причина в том, неодобрение из auto_ptr

Чтобы исправить это, используйте подталкивание 1,60 или более поздней версии, или скомпилировать с -std = гну ++ 98.

+1

Инициализация 'weight' является единственной проблемой, присутствующей в вашем вопросе. Публикация «других проблем вызвана» не помогает никому найти решение в случае, если он сталкивается с той же проблемой. Вы должны действительно исправить вопрос, чтобы ответ был полезным. – sehe

+1

Спасибо за редактирование. Чтобы люди могли найти это, вам нужно будет описать ошибку, а не то, что должно работать. Что компилятор говорит? Каковы основные ингредиенты для этого? – sehe

+1

Замечательный. Это более полезно. Теперь, когда вы действительно включили сообщения компилятора, мы можем заключить, что это ** не было ** ошибкой, а предупреждением. Недостаток 'auto_ptr'. Это очень сложно. (Лучшее решение - повышение уровня) – sehe

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

  • Нет связанных вопросов^_^