Насколько я понял, при добавлении элемента в вектор через emplace_back, он станет на свободное место (т.е. был элемент, его удалили, вот и свободное место) или же в конец вектора. Вопрос: как получить указатель на только что добавленный элемент вектора?
Ответ
Если вас интересует именно указатель на добавленный элемент, а не итератор, то вы можете его получить, допустим, следующим образом:
#include
int main()
{
std::vector
v.emplace_back( int( 'A' ), 'A' );
auto p = &v.back();
std::cout << p->first << ": " << p->second << std::endl;
}
Вывод программы на консоль:
65: A
Ежели вы используете метод insert вместо одного из методов всавки в конец вектора, то метод insert возвращает итератор на вставленный элемент. Поэтому вы можете получить указатель на элемент, используя этот итератор. Например,
#include
int main()
{
std::vector
auto it = v.insert( std::find( v.begin(), v.end(), 4 ), 3 );
int *p = &*it;
std::cout << *it << "\t" << *p << std::endl;
}
Вывод программы на консоль:
3 3
В программе для обращения к вставленному элементу используется как итератор, так и указатель.
Также так как вы можете обращаться к элементам вектора, используя оператор индексации, то вы всегда можете получить указатель на любой элемент, зная его индекс. например,
std::vector
int *p = &v[2];
Имейте в виду, что когда элемент вектора удаляется, то все элементы, стоящие за удаляемым элементом, сдвигаются к началу вектора, занимая место удаленного элемента, если только удаленный элемент не был последним элементом вектора.
То есть элементы вектора всегда располагаются последовательно друг за другом в непрерывном участке памяти. Никаких "дыр" в векторе не бывает.
Если вам надо вставлять элементы в середину вектора, то лучше будет использовать std::deque, или если прямой доступ к элементам не нужен, то std::list
Комментариев нет:
Отправить комментарий