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++还不熟悉。如果有人能帮助我,那会很好。
答
您没有括号围绕:
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
方法。
答
是,使用列表,而不是设置(和的push_back(),而不是插入())的作品。
但是请注意,通常修改您正在迭代的集合并不是一个好主意。它可能导致非常讨厌的错误。通常最好在新数据结构中创建迭代结果,并在最后复制它。
另一种说法是,在你的例子中,你根本没有使用第二个内部循环。
你准确得到了什么错误? “标示为错误”并没有说明什么。 – interjay
你为什么编辑问题以匹配答案?人们应该如何看待问题是什么? – Barmar