Страницы

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

пятница, 10 января 2020 г.

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

#cpp #vector


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


Ответы

Ответ 1



Если вас интересует именно указатель на добавленный элемент, а не итератор, то вы можете его получить, допустим, следующим образом: #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.

Ответ 2



В векторе нет "свободных мест", в нем есть только непрерывная последовательность элементов. emplace_back (как и push_back) добавляет элемент в конец вектора. После v.emplace_back() добавленный элемент будет в конце вектора, и ссылку на его можно получить вызвав v.back(). Соответственно выражение &v.back() выдает указатель.

Ответ 3



Если добавлен в конец: &v.back();

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

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