STL вектор и указатели на элементы вектора - PullRequest
1 голос
/ 10 октября 2011

Существует два вектора STL, один с объектами, а второй с указателями на объекты.

v_objects = [obj1, obj2, obj3, obj4]
v_ptr = [ptr_to_obj1, ptr_to_obj2, ptr_to_obj3, ptr_to_obj4]

Вектор v_ptr используется для сортировки элементов в v_objects.Допустим, что-то добавлено в v_objects, поэтому оно выглядит следующим образом:

v_objects = [obj1, obj2, obj3, obj4, obj5]

Предположим, что v_objects после вставки перераспределены где-то еще, а указатели в v_ptr недействительны.Теперь я хочу отсортировать объекты, используя их указатели в v_ptr, но они недопустимы.Можно ли каким-то образом создать несколько умных указателей, которые указывают на тот же объект, каким они были до перераспределения (используя stl :: vector)?

Ответы [ 3 ]

4 голосов
/ 10 октября 2011

Я так не думаю. Вы могли бы, вероятно, избавить себя от проблем, просто используя один вектор с shared_ptr s для ваших объектов, или просто использовать ptr_vector.

3 голосов
/ 10 октября 2011

Существует несколько способов решения этой проблемы:

  1. Вы можете изменить v_objects для хранения указателей на объекты (это усложнит управление памятью, но использование интеллектуальных указателей может помочь).
  2. Вы можете изменить v_ptr, чтобы хранить индексы в v_objects вместо указателей.

Мое личное предпочтение было бы последним.

1 голос
/ 10 октября 2011

Я не до конца понимаю, что вы хотите сделать, но вы можете хранить индексы в контейнере, а не в указателях.Функтор компаратора для сортировки будет хранить ссылку на вектор и разыменовывать элементы для получения значений.

Пока порядок элементов в исходном векторе не меняется (т.е. только вставки в конце), вектор индексов все равно будет действительным.Что делать с вновь добавленными элементами или если какие-либо другие изменения выполняются с исходным вектором, это отдельная история:

// sketch (reorganize code as needed):
std::vector< type > original = load();
struct compare_indexed {
   std::vector< type > const & v;
   compare_indexed( std::vector< type > const & v ) : v(v) {}
   bool operator()( int lhs, int rhs ) const {
      return v[lhs] < v[rhs];
   }
};
// Create original index vector
std::vector< int > indices;
for ( unsingned int i = 0; i < original.size(); ++i ) {
   indices.push_back( i );
}
std::sort( indices.begin(), indices.end(), compare_indexed( original ) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...