通过迭代器的c++访问集

C++ access set via iterator

本文关键字:访问 c++ 迭代器      更新时间:2023-10-16

我有以下代码:

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);
         }
    }
}

假设"condition"是一个布尔值。我对regions_it->insert(v)尤其有困难。箭头(->)被标记为错误。我尝试了regions_it.insert(v),但它也不起作用。

regions_it应该是一个指针,指向一组体素,如果我没有错,但我怎么能调用插入方法?

我对c++还不熟悉。如果有人能帮我一下就太好了。

没有大括号:

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引用。const std::set没有insert方法

是的,使用list代替set(和push_back()代替insert())工作

但是请注意,一般来说,修改你正在迭代的集合不是一个好主意。它会导致非常讨厌的虫子。一般来说,在一个新的数据结构中创建迭代的结果,并在末尾复制它是一个好主意。

另一个注意事项是,在您的示例中,您根本没有使用第二个内部循环。