2016-09-18 84 views
-2

設置,我有以下代碼:C++通過訪問迭代器

struct voxel 
{ 
    int x, y, z; 
}; 
std::set<std::set<voxel>> regions; 

std::set<std::set<voxel>>::iterator regions_it; 
std::set<voxel>::iterator voxel_it; 
for (regions_it = regions.begin(); regions_it != regions.end(); regions_it++){ 
    for (voxel_it = regions_it->begin(); voxel_it != regions_it->end; voxel_it++){ 
     if (condition){ 
      struct voxel v = { 1, 2, 3 }; 
      regions_it->insert(v); 
     } 
    } 
} 

只是假設,「條件」是一個布爾值。我特別遇到regions_it->insert(v)問題。箭頭( - >)標記爲錯誤。我嘗試了regions_it.insert(v),但它也不起作用。

regions_it應該是一個指向一組體素的指針,如果我沒有弄錯,但我怎樣才能調用插入方法?

我對C++還不熟悉。如果有人能幫助我,那會很好。

+0

你準確得到了什麼錯誤? 「標示爲錯誤」並沒有說明什麼。 – interjay

+0

你爲什麼編輯問題以匹配答案?人們應該如何看待問題是什麼? – Barmar

回答

1

您沒有括號圍繞:

if (condition) 
      struct voxel v = { 1, 2, 3 }; 
      regions_it->insert(v); 

所以v是超出了範圍,當您嘗試使用它。

您還沒有把括號在這裏結束:

for (voxel_it = regions_it->begin(); voxel_it != regions_it->end; voxel_it++){ 

然而,主要的問題是,你不能改變的元素在一組,因爲它們是用於排序集的內容和如果您直接更改它們,該設置可能不再按預期運行。因此,對一個集合取消引用迭代器會返回const對其內容的引用。 A const std::set沒有insert方法。

+0

你好,首先對於那些語法錯誤感到抱歉,我不想複製整個代碼,使問題變得不必要的複雜。謝謝您的回答。我想,答案是,使用列表來代替? – Broccoli

+0

簡短的答案是「隨處使用矢量」。從性能角度來看,幾乎所有其他STL容器都很糟糕。如果你不關心表現,那麼列表就可以工作,但是你說體素讓我覺得你可能。 – xaxxon

+0

注意迭代器失效,但。任何類型的矢量修改都會使所有迭代器和指針無效。這是列表更容易使用的原因之一(但你仍然不應該) – xaxxon

0

是,使用列表,而不是設置(和的push_back(),而不是插入())的作品。

但是請注意,通常修改您正在迭代的集合並不是一個好主意。它可能導致非常討厭的錯誤。通常最好在新數據結構中創建迭代結果,並在最後複製它。

另一種說法是,在你的例子中,你根本沒有使用第二個內部循環。