Сначала подумайте, нужен ли вам указатель на элемент или вы просто пытаетесь использовать итераторы, но избегаете их. Похоже, вы пытаетесь кодировать C на C ++, а не кодировать C ++. В приведенном вами примере кажется, что вместо преобразования в указатель и последующей работы с этим указателем, почему бы просто не использовать итератор напрямую? it->doSomething()
вместо ird->doSomething()
.
Если вы думаете, что вам нужно сохранить этот указатель для последующего использования в векторе после некоторой работы, это потенциально опасно. Векторные итераторы и , указывающие на элементы в векторе, могут быть признаны недействительными, то есть они больше не указывают на вектор, поэтому вы в основном пытаетесь использовать память после ее освобождения, что опасно. Типичным примером того, что может сделать недействительным итератор, является добавление нового элемента. Я попал в беспорядок, пытаясь сохранить итератор, и проделал большую работу, чтобы попытаться заставить его работать, включая написание функции re_validate_iterator (). В конечном счете, мое решение оказалось очень запутанным и даже не работало во всех случаях, кроме того, что оно не масштабировалось.
Решением для сохранения положения вектора является сохранение его в виде смещения. Некоторое целое число, указывающее позицию в векторе, в котором находится ваш элемент. Затем вы можете получить к нему доступ либо с помощью myvector.begin() + index
, если вам нужно работать с итераторами, либо с помощью myvector.at (index)
, если вам нужна ссылка на сам элемент с проверкой границ, или просто myvector [index]
, если вам не нужна проверка границ.