我正在使用boost圖庫並嘗試初始化MutableGraph
以啓動網格生命。 邊緣將被添加和刪除生活後期,所以我認爲adjacency_list<vecS,listS,undirectedS>
是正確的選擇。使用boost :: copy_graph從grid_graph複製到adjacency_list
我對BGL讀數表明,合理的方式與這些邊緣initalise這將是通過使用 boost::copy_graph
從boost::grid_graph
,可以使一切對我最初的邊緣免費拷貝到利用boost::grid_graph
。 我認爲這是有道理的 - copy_graph
從模型VertexListGraph
複製到MutableGraph
,這正是我所擁有的模型。
我最初嘗試使用copy_graph
的雙參數版本,並且模糊地希望其餘的默認值會發生一些明智的事情。事實證明,情況並非如此,grid_graph
(由於我無法弄清楚的原因)似乎沒有使用PropertyMap
s的邊或頂點的功能,所以默認vertex_copy
和edge_copy
失敗(使用編譯器錯誤)複製屬性。
由於2個參數的版本顯然不合適,我繼續嘗試實現自己的二元運算符來複制頂點和邊。即使使用'no-op'副本,這也不會像我希望的那樣工作(即它不會編譯)。
我已經把最低工作的例子,說明了這個問題:
#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));
}
這個例子不能編譯:
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> >&)
我是錯誤的分析是,它似乎是試圖默認構建grid_graph
的內部部分,這不能被默認構建,出於某種原因,這對我來說不是很清楚。 (clang並沒有真正告訴我任何我在g ++裏看不到的東西)。
問題:
- 這是去了解initalising一個可變圖開始作爲常規電網的正確方法?我最初認爲這比自己寫一個函數要容易得多,但現在我不太確定!
- 爲什麼默認值
orig_to_copy
和/或vertex_index
在這裏不合適?我假設這兩個是錯誤的原因。 (如果有的話,這實際上是造成這個問題的原因?我無法破譯當前錯誤的根本原因是什麼)。 - 解決此問題的「正確」方法是什麼?
快速檢查:談論你把它稱爲'named_param1'命名參數和'named_param2'一路過關斬將時直到它突然變成'boost :: named_parameter1'和'boost :: named_parameter2'這個鏈的第一部分的例子的文本 - 是一個錯字? – Flexo
@awoodland:不是拼寫錯誤,因爲第一個是'boost'命名空間中的*函數*,它返回一個具有*方法*的對象用於其他命名參數。 'boost :: named_parameter1(val1).named_param2(val2)'通過調用'boost :: named_parameter1' *函數*首先配置'named_parameter1'參數。然後通過調用'boost :: named_parameter1()'返回的對象上的'named_parameter2' *方法*來配置'named_parameter2'參數。 –
原來,我最初試過這個答案的機器運行的是1.46。在1.42的機器上,它無法編譯完全相同的錯誤,我看到。我想這是1.42的錯誤?這個答案仍然解決了我在嘗試過的所有其他問題,對此我非常感激。 – Flexo