отодвигать импульс boost :: ptr_vector <...> :: итератор в другой boost :: ptr_vector? - PullRequest
1 голос
/ 22 марта 2010

У меня есть следующий код (только что набрал его здесь, может быть опечатки или прочее):

typedef boost::ptr_vector<SomeClass> tvec;
tvec v;

// ... fill v ...

tvec vsnap;

for(tvec::iterator it = v.begin(); it != v.end(); ++it)
{
   if((*v).anyCondition)
       vsnap.push_back( it ); // (*it) or &(*it) doesn't work
}

Моя проблема в том, что теперь я не могу push_back итератор, я просто не получаю указатель из итератора.

Есть ли простой способ, которого я не видел, или бусты ptr_vector - ложный выбор для этого случая?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 22 марта 2010

Разыменование ptr_vector :: iterator дает вам ссылку.Затем вы можете использовать &, чтобы получить адрес этой ссылки, поэтому vsnap.push_back(&(*it)) должен скомпилироваться.Какую ошибку вы получаете?

Кроме того, обратите внимание, что вы используете неправильно.Старый объект ptr_vector является владельцем объекта, независимо от того, что вы делаете с адресом объекта.Таким образом, с вашим кодом у вас будет два ptr_vectors, владеющих одним и тем же объектом.Тогда они оба попытались бы удалить его, и вы бы потерпели крах.Вы, вероятно, хотите передать право собственности вместо этого:

vsnap.push_back(v.release(it));

Конечно, это удаляет объект из старого вектора перед добавлением его в новый.Если вы хотите, чтобы объект оставался в обоих векторах, вы можете использовать std :: vector или std :: vector>.Другая альтернатива - оставить первый boost :: ptr_vector, но сделать второй std :: vector, который ничего не имеет и просто указывает на объекты в исходном векторе.Тогда вы должны быть осторожны с жизнями.

0 голосов
/ 22 марта 2010

Вам необходимо клонировать объекты, содержащиеся в первом векторе:

for(tvec::iterator it = v.begin(); it != v.end(); ++it)
{
   if((*v).anyCondition)
      vsnap.push_back(new_clone(*it));
}
...