2011-11-24 38 views
0

我在使用數組列表時遇到了一些麻煩。 因此,要清除事情我知道我不能有一個包含數組的std :: list。 我正在使用boost :: array能夠做到這一點。std :: boost :: arrays列表

目前,我對我的尋路算法所需的所有數據類型進行了原型測試,並測試了它們的速度和緩存一致性。

typedef boost::array<int,2> VertexB2i; 
typedef std::list<VertexB2i> VertexList; 

這些類型不用於尋路,他們只是更容易使用,那麼所有的真正的C++數組和國旗的探路者,所以他們只是用於生成導航網格。 (我也知道在這種情況下我可以使用stl :: pair來代替boost :: array,但是我想保持生成的數據與探測器數據儘可能相似,所以我不必處理完全兩個不同的接口的全部時間)

VertexList* vl = new VertexList(); 
vl->push_back({{8,28}}); // this does not work, why? 

因此,儘管這兩個數據類型設置一些測試數據,我注意到,註釋行不工作,雖然這不會工作:

VertexList* vl = new VertexList(); 
VertexB2i ver1 = {{8,28}}; 
vl->push_back({ver1}); // works 

所以總結一下: 反正有沒有先推出「VertexB2i」而沒有首先聲明它是分段的? 一般意見?

+4

好,STD,不是STL。 – Griwes

+0

vl-> push_back(ver1)); ??? –

+0

哪個編譯器? GCC 4.5有一個初始化列表錯誤,而VC10根本不支持統一初始化。 –

回答

2

std::array(或boost::array)是一個聚集類型。在C++ 98/03只能在聲明符進行初始化:

std::array<int, 2> arr = { 1, 2 }; 
thelist.push_back(arr); // makes a copy 

在C++ 11,可以使用統一的初始化創建的臨時對象,以及:

std::list<std::array<int,2>> l; 

l.push_back(std::array<int,2>{{2,3}});  // maybe copy 
l.emplace_back(std::array<int,2>{{2,3}}); // maybe copy, probably optimized out 
+0

謝謝,清理了一些東西,我可能會仔細檢查反彙編程序是否有另一個副本... – niktehpui