Destek grafiği kitaplığını kullanıyorum ve hayatı bir kılavuz olarak başlatmak için MutableGraph
numaralı telefonu kullanmaya çalışıyorum. Kenarlar hayata daha sonra eklenecek ve kaldırılacak, bu yüzden adjacency_list<vecS,listS,undirectedS>
doğru seçim olduğunu düşünüyorum. grid_graph öğesinden comacency_list'e kopyalama ile kopyalama :: copy_graph
BGL hakkında My okuma
mantıklı yolu benim için ücretsiz tüm başlangıç kenarları yapabilirboost::grid_graph
kopyalamak
boost::copy_graph
kullanarak
boost::grid_graph
yararlanmak olacaktır bu kenarları ile initalise için belirtti. Bu,modelinden
MutableGraph
modeline göre,
copy_graph
kopyaları yaptığımı düşündüm.
Başlangıçta, copy_graph
'un 2-argüman sürümünü kullanmaya çalıştım ve geri kalanın varsayılanları ile ilgili mantıklı bir şey olacağını belirsiz belirttim. Durumun böyle olmadığı ortaya çıktı, grid_graph
(tam olarak anlayamadığım nedenlerden dolayı) PropertyMap
s kenarlarından veya köşe noktalarından yararlanabilme özelliği yok gibi görünüyor, bu nedenle varsayılan vertex_copy
ve edge_copy
başarısız oldu (bir derleyici ile birlikte) hata) özellikleri kopyalamak.
2-argümanı sürümü açıkça uygun görünse, köşeleri ve kenarları kopyalamak için kendi ikili operatörümüzü uygulamaya devam ettim. Bir 'no-op' kopyasıyla bile, bu umduğum kadar işe yaramıyor (yani derleme yapmıyor).
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/grid_graph.hpp>
#include <boost/graph/copy.hpp>
struct Position {
int x, y;
};
struct VertexProperties {
Position pos;
};
typedef boost::adjacency_list<boost::vecS, boost::listS, boost::undirectedS,
VertexProperties> Graph;
struct MyCopy {
template <typename S, typename D>
void operator()(const S& /*src*/, D& /*dest*/) {
// Nothing for now, deduced types to try and just make it compile
// TODO: set values for pos to reflect position on grid.
}
};
int main() {
boost::array<std::size_t, 2> lengths = { { 3, 3 } };
boost::grid_graph<2> grid(lengths);
Graph graph;
MyCopy copier;
// Using 3-Arg version of copy_graph so we can specify a custom way of copying to create the properties
boost::copy_graph(grid,graph,boost::bgl_named_params<MyCopy,boost::vertex_copy_t,
boost::bgl_named_params<MyCopy,boost::edge_copy_t> >(copier));
}
Bu örnek derleme değil:
ben birlikte sorunu göstermektedir minimum çalışma örneği koyduk
g++ -Wextra -Wall -O2 -g -o copytest.o -c copytest.cc
In file included from /usr/include/boost/graph/grid_graph.hpp:24:0,
from copytest.cc:2:
/usr/include/boost/iterator/transform_iterator.hpp: In constructor ‘boost::transform_iterator<UnaryFunction, Iterator, Reference, Value>::transform_iterator() [with UnaryFunc = boost::detail::grid_graph_vertex_at<boost::grid_graph<2u> >, Iterator = boost::counting_iterator<unsigned int, boost::use_default, boost::use_default>, Reference = boost::use_default, Value = boost::use_default]’:
/usr/include/boost/graph/copy.hpp:115:55: instantiated from ‘static void boost::detail::copy_graph_impl<0>::apply(const Graph&, MutableGraph&, CopyVertex, CopyEdge, Orig2CopyVertexIndexMap, IndexMap) [with Graph = boost::grid_graph<2u>, MutableGraph = boost::adjacency_list<boost::vecS, boost::listS, boost::undirectedS, VertexProperties>, CopyVertex = MyCopy, CopyEdge = MyCopy, IndexMap = boost::grid_graph_index_map<boost::grid_graph<2u>, boost::array<unsigned int, 2u>, unsigned int>, Orig2CopyVertexIndexMap = boost::iterator_property_map<__gnu_cxx::__normal_iterator<void**, std::vector<void*, std::allocator<void*> > >, boost::grid_graph_index_map<boost::grid_graph<2u>, boost::array<unsigned int, 2u>, unsigned int>, void*, void*&>]’
/usr/include/boost/graph/copy.hpp:327:5: instantiated from ‘void boost::copy_graph(const VertexListGraph&, MutableGraph&, const boost::bgl_named_params<P, T, R>&) [with VertexListGraph = boost::grid_graph<2u>, MutableGraph = boost::adjacency_list<boost::vecS, boost::listS, boost::undirectedS, VertexProperties>, P = MyCopy, T = boost::vertex_copy_t, R = boost::bgl_named_params<MyCopy, boost::edge_copy_t>]’
/mnt/home/ajw/code/hpcwales/copytest.cc:31:66: instantiated from here
/usr/include/boost/iterator/transform_iterator.hpp:100:26: error: no matching function for call to ‘boost::detail::grid_graph_vertex_at<boost::grid_graph<2u> >::grid_graph_vertex_at()’
/usr/include/boost/graph/grid_graph.hpp:104:7: note: candidates are: boost::detail::grid_graph_vertex_at<Graph>::grid_graph_vertex_at(const Graph*) [with Graph = boost::grid_graph<2u>]
/usr/include/boost/graph/grid_graph.hpp:100:33: note: boost::detail::grid_graph_vertex_at<boost::grid_graph<2u> >::grid_graph_vertex_at(const boost::detail::grid_graph_vertex_at<boost::grid_graph<2u> >&)
o hatanın analizim gibi görünüyor olmasıdır varsayılan olarak, grid_graph
dahili içeriğinin bir kısmını yapılandırmaya çalışmak, varsayılan olarak yapılamamaktadır, çünkü bu durum bana açık değildir. (clang bana g ++ 'dan göremediğim bir şey söylemiyor).
Sorular:
- bu normal bir ızgara olarak başlamak için değişken grafiği initalising hakkında en doğru yol var mı? Başlangıçta kendim yapmak için bir işlev yazmaktan çok daha kolay olduğunu düşündüm, ama şimdi o kadar emin değilim!
- Neden varsayılan değer
orig_to_copy
ve/veyavertex_index
burada uygun değil? Bu ikisinin hatanın sebebi olduğunu varsayıyorum. (Hangi, aslında, bu sorunu neden olan nedir? Geçerli hatanın kök nedenini deşifre edemiyorum). - Bunu düzeltmenin "doğru" yolu nedir?
Hızlı kontrol: adlandırılmış Eğer named_param1' 'uyarınca kendisine intikal parametreleri ve' named_param2' tüm yoldan bahsederken Metin, aniden 'boost :: named_parameter1' ve 'boost :: named_parameter2' zincirinin ilk parçası olan örneklere kadar - bir yazım hatası mıydı? – Flexo
@awoodland: Bir yazım hatası değil, çünkü birincisi, "boost" ad alanında bir * işlevdir; bu, diğer adlandırılmış parametreler için * yöntem * içeren bir nesneyi döndürür. boost :: named_parameter1 (val1) .named_param2 (val2) '' boost :: named_parameter1' * işlevini * çağırıp 'named_parameter1' parametresini yapılandırır. Ardından, "named_parameter1" parametresi "boost :: named_parameter1()' tarafından döndürülen nesne üzerinde "named_parameter2' * yöntemini * çağırarak" named_parameter2' parametresini yapılandırır. –
Bu cevabı aslında denediğim makinenin 1.46 çalıştırdığını görüyor. 1.42 ile bir makinede, gördüğüm tam olarak aynı hatayı derlemek başarısız. Sanırım 1.42'de bir böcek mi? Bu cevap benim denememde yaşadığım tüm diğer problemleri hala çözüyor, ki bunun için çok minnettarım. – Flexo