Страницы

Поиск по вопросам

среда, 27 февраля 2019 г.

Получить указатель на новый элемент вектора c++

Насколько я понял, при добавлении элемента в вектор через emplace_back, он станет на свободное место (т.е. был элемент, его удалили, вот и свободное место) или же в конец вектора. Вопрос: как получить указатель на только что добавленный элемент вектора?


Ответ

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

Комментариев нет:

Отправить комментарий