C++ std::set迭代器的常量指针类型转换

C++ std::set迭代器的常量指针类型转换,c++,casting,set,constants,elements,C++,Casting,Set,Constants,Elements,我这里有个难题。我正在写一个网格生成器。在这样做时,我需要从高维元素(即“三角形”元素由3个“直线”元素组成)中获取低维元素的列表。我需要唯一行元素的列表,我需要父元素存储指向其每个唯一子元素的指针 为此,我创建了一组指向子元素的智能指针,并尝试将每个子元素插入到列表中。每次我尝试插入一个元素时,我都会请求一对,其中包含一个迭代器到预先存在的元素,以及一个布尔值,用于指定是否已插入该元素 问题是std::set(和map)将常量迭代器返回到预先存在的元素。但是,我需要给出我未能插入指向预先存在的

我这里有个难题。我正在写一个网格生成器。在这样做时,我需要从高维元素(即“三角形”元素由3个“直线”元素组成)中获取低维元素的列表。我需要唯一行元素的列表,我需要父元素存储指向其每个唯一子元素的指针

为此,我创建了一组指向子元素的智能指针,并尝试将每个子元素插入到列表中。每次我尝试插入一个元素时,我都会请求一对,其中包含一个迭代器到预先存在的元素,以及一个布尔值,用于指定是否已插入该元素

问题是std::set(和map)将常量迭代器返回到预先存在的元素。但是,我需要给出我未能插入指向预先存在的元素的非常量指针的元素的父元素。所以我使用const_pointer_cast将常量迭代器转换为非常量迭代器

有没有更好的办法?执行常量指针转换()可能并不理想。我是否应该在这个应用程序中使用一些东西而不是std::set

编辑:功能如下:

模板
int getUniqueSubelements(标准::集合和元素,
标准:集合和子集合)
{
typedef std::共享\u ptr子\u ptr;
std::配对ret;
for(auto-parit=elements.begin();parit!=elements.end();++parit)
{
(*parit)->generateChildren();
const std::vector&children=(*parit)->getChildren();
对于(int i=0;i交换父母(临时、东方);
}
}
}
返回1;
}

这里根本不需要演员阵容

确实,
std::set::iterator
std::set::const\u iterator
相同,并且
iterator::operator*
返回一个
const K&

但在您的情况下,这意味着
*ret.first
的类型是
const std::shared\u ptr&
。这类似于
(T2*const)
,而不是
(const T2*)
:您不能修改智能指针,但可以修改实际存储的对象

所以假设
elOrientation

template <typename T>
bool elOrientation(std::shared_ptr<T>, std::shared_ptr<T>);
模板
bool-elOrientation(std::shared_-ptr,std::shared_-ptr);

您可以调用
elOrientation(children[i],*ret.first)

“问题是std::set(和map)将常量迭代器返回到预先存在的元素。”
-您可以向我们展示代码来证明这一点吗?您的断言完全正确。从插入中得到一个(非常量)迭代器。问题在于,集合迭代器不允许对集合元素进行变异。(相比之下,映射迭代器则大不相同。)整个描述很难理解,让我觉得应该编写自己的类。这就是为什么
std::set
std::map
的键是常量的原因。您可以添加一些示例代码来演示您的情况吗?此代码中没有一个
共享的\u ptr
。可能有一些
const shared\u ptr&
,但是可以很好地复制。