获取指向std :: set(c ++)中对象的指针

时间:2011-06-12 22:18:20

标签: c++ pointers stl set

我有一个标准集S. S包含一些MyType实例。 这是在S中获取指向MyType实例的指针的最佳方式吗?

MyType *pointerToMyType = (MyType*)(&*S.find(anotherInstanceOfMyType));

以上代码有效。我只是不确定它是最好还是最安全的方式。

修改:我在上面一行之前检查了找到S.end()的结果。

编辑:删除演员表会导致以下编译时错误:“从'const MyType *'到'MyType *'的转换无效”

4 个答案:

答案 0 :(得分:3)

你应该采用可变引用或指向set中元素的指针。如果更改了它的属性,那么您将使容器的不变量无效,从而导致未定义的行为。那个编译时错误是有充分理由的,而且,你的代码显示了为什么C风格的强制转换是坏的一个很好的例子 - 因为它们可以抛弃const,而其他任何回答者都没有注意到,而如果你曾经被迫使用const_cast,每个人都会注意到它有多糟糕。

但是,如果你选择有效的const MyType*,那么演员阵容将是多余的,&*iterator是一个非常好的方法。

答案 1 :(得分:1)

两件事,

  1. static_cast
  2. 在抓取指针之前,你应该检查对象是否存在。
  3. 至于方法,如果你充实了你想要做的事情,可能会有更好的方法......

    编辑:哎呀,static_cast也是多余的......习惯,每当我看到C风格的演员......

答案 2 :(得分:1)

你有什么不错,但是:

  • 您应该在解除引用之前检查迭代器是否有效。
  • 没有必要演员。

答案 3 :(得分:1)

假设你知道元素存在......

  

这是在S中获取指向MyType实例的指针的最佳方法吗?

没有。你不需要演员。如果你这样做,它不应该是C演员,它应该是const_cast