Получить указатель на объект в std :: set (c ++) - PullRequest
0 голосов
/ 13 июня 2011

У меня есть стандартный набор S. S содержит несколько экземпляров MyType. Это лучший способ получить указатель на экземпляр MyType в S?

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

Приведенный выше код работает. Я просто не уверен, что это лучший или самый безопасный способ.

Редактировать : Я проверяю результат поиска в S.end () перед строкой выше.

Редактировать : удаление приведения вызывает следующую ошибку времени компиляции: «Неверное преобразование из« const MyType * »в« MyType * »»

Ответы [ 4 ]

3 голосов
/ 13 июня 2011

Вы должны не взять изменяемую ссылку или указатель на элемент в set. Если вы измените его свойства, вы лишите законной силы инварианты контейнера, что приведет к неопределенному поведению. Эта ошибка во время компиляции существует по уважительной причине, и, кроме того, ваш код демонстрирует отличный пример того, почему приведение в стиле C плохое - потому что оно может отбрасывать const, и никто из других ответчиков не заметил, тогда как если бы вынужденный использовать const_cast, все бы заметили, насколько это плохо.

Однако, если вы возьмете действительное const MyType*, то приведение будет избыточным, и &*iterator - это отличный способ для этого.

1 голос
/ 13 июня 2011

То, что у вас хорошо, хотя:

  • Вероятно, вам следует проверить, что итератор действителен перед разыменованием.
  • Нет необходимости в приведении.
1 голос
/ 13 июня 2011

Предполагая, что вы знаете, что элемент существует ...

Это лучший способ получить указатель на экземпляр MyType в S?

Нет.Вам не нужен актерский состав.И если вы это сделали, это не должно быть C-броском, это должно быть const_cast.

1 голос
/ 13 июня 2011

две вещи,

  1. static_cast
  2. Перед захватом указателя вы должны убедиться, что объект существует в наборе.

Что касается подхода, если бы вы уточнили, что вы пытаетесь сделать, мог бы быть лучший способ ...

РЕДАКТИРОВАТЬ: ой, static_cast тоже избыточно ... привычка, всякий раз, когда я вижу приведение в стиле C ...

...