Случайным образом назначить boost::ptr_vector

Я хочу случайным образом назначить boost::ptr_vector. Используя обычный вектор STL, я бы сделал это:

class A{

};

A* a1 = new A();
A* a2 = new A();

vector<A*> normal_vec;
normal_vec.resize(2);
normal_vec[1] = a1;
normal_vec[0] = a2;

Я пытаюсь сделать то же самое с boost::ptr_vector:

A* a1 = new A();
A* a2 = new A();

ptr_vector<A> boost_vec;
boost_vec.resize(2);

boost_vec[1] = a1;
boost_vec[0] = a2;

Но получаю следующую ошибку:

no match for ‘operator=’ in ‘v.boost::ptr_vector<A>::<anonymous>.boost::ptr_sequence_adapter<T, VoidPtrSeq, CloneAllocator>::operator[] [with T = A, VoidPtrSeq = std::vector<void*, std::allocator<void*> >, CloneAllocator = boost::heap_clone_allocator, boost::ptr_sequence_adapter<T, VoidPtrSeq, CloneAllocator>::reference = A&, boost::ptr_sequence_adapter<T, VoidPtrSeq, CloneAllocator>::size_type = long unsigned int](1ul) = a1’

Но я изо всех сил пытаюсь понять это

См. также: stackoverflow .com/questions/13367079/   —  person Aly    schedule 14.11.2012

Похоже, вы не читали документацию по типам, которые используете.   —  person Aly    schedule 14.11.2012

В вашем примере std::vector не так, как обычно добавляют к vector. Используйте push_back (после необязательного вызова reserve) вместо operator[].   —  person Aly    schedule 14.11.2012

Весь смысл boost::ptr_vector в том, что вы не видите указатели.   —  person Aly    schedule 14.11.2012

@Praetorian Я хочу назначить случайным образом, то есть не 0-му, а 1-му индексу (см. Выше). Я делаю v[1], за которым следует v[0]   —  person Aly    schedule 14.11.2012

Вы всегда можете перетасовать упорядоченный вектор или вместо этого поместить случайно выбранный экземпляр объекта в вектор.   —  person Aly    schedule 14.11.2012

@Rook Я не хочу, чтобы он имел случайный порядок, но я хочу назначать его непоследовательно.   —  person Aly    schedule 14.11.2012

Возможно, вы захотите уточнить, что в вашем вопросе я хочу случайным образом назначить boost::ptr_vector, особенно учитывая, что конечный результат случайной вставки и последовательной вставки случайных элементов одинаков…   —  person Aly    schedule 14.11.2012

См. также:  Как вы вызываете несколько файлов из командной строки в свое приложение?

@Rook заголовок назначается случайным образом для boost::ptr_vector   —  person Aly    schedule 14.11.2012

Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. Aly

    Вы должны использовать ptr_vector<T>::replace вместо operator[]. operator[] возвращает T& вместо T*&, поэтому вы можете присвоить только значение, а не указатель.

    Также обратите внимание, что у вас есть утечка памяти, когда выбрасывается второй new для a2, a1 не удаляется в коде ниже:

    A* a1 = new A();
    A* a2 = new A();
    

    Рассмотрите возможность использования std::unique_ptr.

    Извините, можете прояснить утечку памяти? Это только в первом блоке кода? Если да, то я понимаю. Если его второй код заблокирован, я озадачен, так как думал, что ptr_vector обрабатывает удаления person Aly; 14.11.2012

    Он имеет в виду, что при выделении A* a2 = new A(), если это выделение не удается, то первое выделение A *a1 = new A() никак не может быть удалено кодом, потому что оно не обрабатывается. Отсюда и причина, по которой он предложил использовать умный указатель. Но если это небольшое приложение, то вам не нужно беспокоиться о подобных вещах, хотя обычно вы должны использовать интеллектуальные указатели, любое выделение, которое не было удалено, будет обработано ОС после выхода из программы. person Aly; 14.11.2012

  2. Aly

    Также обратите внимание, что в вашей программе есть ошибка. Индексация начинается с 0, а не с 1.

    Спасибо, должен был быть тип v[1], v[0] (я хочу, чтобы они были не по порядку) person Aly; 14.11.2012

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: