Можно ли захватить перераспределения std :: vector? - PullRequest
0 голосов
/ 26 февраля 2019

Я знаю, что push_back () для std :: vector может вызвать перераспределение и, следовательно, сделать недействительными итераторы в указателе.Есть ли способ установить перехват для перераспределений (что, по-видимому, происходит очень редко), чтобы я мог соответствующим образом настроить итераторы?

В идеале что-то вроде этого:

class hook; // forward
std::vectorwithhook<T,hook> v;
auto pointer = v.end();

template<> class hook<T> {
  void operator()(T *old, T *new) { pointer += new-old; }
}

и затем я могу push_back() на v и играйте с указателем без страха.

1 Ответ

0 голосов
/ 26 февраля 2019

ИМХО самый простой способ сделать это - заставить ваш vectorwithhook :: push_back вернуть новый end () и использовать его следующим образом:

pointer = v.push_back (new_item);

ПРИМЕЧАНИЕ: вам придется сделать это для всех членов, которые изменяют содержимое вектора (например, emplace_back, pop_back, insert и т. Д.)

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

PS Ничто из этого не звучит как хорошая идея, я бы подумал о переработке кодачтобы не использовать итератор end () вместо выполнения каких-либо действий.

...