Предположим, что существует класс A, содержащий вектор ints. Предположим теперь, что вектор A создан. Если происходит перераспределение объекта A (поэтому векторный объект перемещается) из-за push_back, например, будут ли указатели на сами ints действительными? Гарантировано ли это?
Чтобы уточнить:
class A {
public:
A() {};
std::vector<int> a = {1,2,3,4,5,6,7,8,9};
};
int main()
{
std::vector<A> aVec(2);
int *x1 = &(aVec[1].a[2]);
A *x2 = &aVec[1];
std::cout << x1 << " - " << x2 << " - " << aVec.capacity() << "\n";
aVec.resize(30);
int *y1 = &(aVec[1].a[2]);
A *y2 = &aVec[1];
std::cout << y1 << " - " << y2 << " - " << aVec.capacity() << "\n";
}
Запуск этого кода дает следующее:
0x1810088 - 0x1810028 - 2
0x1810088 - 0x18100c8 - 30
поэтому он показывает, что указатели остаются действительными. Но я хочу убедиться, что это гарантировано, а не просто случайность. Я склоняюсь к тому, чтобы сказать, что это гарантировано, поскольку векторные внутренние данные динамически распределены, но, опять же, просто хотели проверить.
Я посмотрел здесь [правила аннулирования Iterator], но не рассматривает этот конкретный случай (например, перераспределение самого векторного объекта).
UPDATE:
Я попробовал это, чтобы проверить, что я написал в комментариях для ответа Jarod42:
std::vector<std::vector<int>> aVec(2, {1,2,3});
int *x1 = &(aVec[1][2]);
std::vector<int> *x2 = &aVec[1];
std::cout << x1 << " - " << x2 << " - " << aVec.capacity() << "\n";
aVec.resize(30);
int *y1 = &(aVec[1][2]);
std::vector<int> *y2 = &aVec[1];
std::cout << y1 << " - " << y2 << " - " << aVec.capacity() << "\n";
и получил следующее:
0x16f0098 - 0x16f0048 - 2
0x16f0098 - 0x16f00c8 - 30
что странно для меня. Я ожидал x2 == y2.