Смена адреса после перераспределения

В приведенном ниже коде каждый раз, когда новый член вставляется в std::vector<int>Aиз-за перераспределения памяти, std::vector<reference_wrapper<int>>B указывает на неправильный адрес. Можно ли сделать ссылочный вектор, чтобы отслеживать перераспределения и всегда сохранять правильный адрес?

#include <iostream>
#include <functional>
#include <vector>
using namespace std;

int main()
{
vector<int> A (0,3);
vector<reference_wrapper<int>> B;
B.push_back ( ref(A[0]) );
B.push_back ( ref(A[1]) );
B.push_back ( ref(A[2]) );

A.push_back (0);

cout << &A[0] << endl;
cout << &B[0].get() << endl;

return 0;
}

-1

Решение

Единственный способ, который я вижу, — зарезервировать достаточно памяти для вектора, чтобы он не был перераспределен при перемещении нового элемента при условии, что вы не удалите или не вставите элементы в середине вектора.

Примите во внимание, что это утверждение

vector<int> A (0,3);

неправильно.

Там должен быть

vector<int> A (3,0);

или просто

vector<int> A (3);

Вы могли бы написать

#include <iostream>
#include <functional>
#include <vector>
using namespace std;

int main()
{
vector<int> A( 3 );
A.reserve( 4 );

vector<reference_wrapper<int>> B;

B.push_back ( ref(A[0]) );
B.push_back ( ref(A[1]) );
B.push_back ( ref(A[2]) );

A.push_back (0);

cout << &A[0] << endl;
cout << &B[0].get() << endl;

return 0;
}

Вывод может выглядеть как

0x9cbd018
0x9cbd018
1

Другие решения

Вы не указали фактическое использование для этого шаблона. Итак, вот несколько возможных решений:

  1. Хранить индекс, а не ссылку / итератор.
  2. Измените A на список или deque, которые не делают недействительными итераторы, отличные от фактически измененных.
  3. Динамически распределяются все целые числа (например, std::shared_ptr<int>) и пусть A и B оба хранят (общий) указатель.
0

По вопросам рекламы [email protected]