C++通过访问迭代器

问题描述:

设置,我有以下代码: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

您没有括号围绕:

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

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

但是请注意,通常修改您正在迭代的集合并不是一个好主意。它可能导致非常讨厌的错误。通常最好在新数据结构中创建迭代结果,并在最后复制它。

另一种说法是,在你的例子中,你根本没有使用第二个内部循环。