Как получить адрес ячейки в которую будет добавлен элемент при push_back() c++
У меня есть вектор с объектами пользовательского класса, в который мне нужно добавить элемент. В конструкторе класса B необходимо знать, куда будет помещен этот элемент (нужен адрес соответствующей ячейки b). Есть ли способ его получить?
std::vector<A> a(2);
std::vector<B> b;
b.push_back(B(std::vector<A*> {&a[0], &a[1]}));
Ответы (2 шт):
Вероятнее всего, тут проблема XY.
Это решение для тех, кто еще не перешел на C++11 и выше. По поводу современного и более красивого решения смотрите другой ответ в этом топике
Нормально получить этот адрес нельзя, так как при вызове push_back() может произойти переаллокация массива и адрес станет негодным. Так что нужно как-то гарантировать, что переаллокации не будет - например, заранее сделать
reserve(a.size()+1); //или +N, если N известно заранее.
auto ofs = a.data()+a.size(); // искомый указатель
Адрес, куда будет помещен объект B - это this в конструкторе. А чтобы он был именно адресом объекта, создаваемого в векторе, а не адресом временного объекта, следует использовать emplace_back:
::std::vector<B> b;
b.emplace_back(constructor_args);