Итак, у меня есть такой вектор:
std::vector<std::unique_ptr<SomeClass>> myVector;
Затем у меня есть другой вектор, который содержит необработанные указатели SomeClass
:
std::vector<SomeClass*> myOtherVector;
Если внутри myOtherVector
есть элемент, он также будет внутри myVector
, поэтому я хочу просмотреть каждый элемент в myOtherVector
и удалить тот же элемент из myVector
. Затем очистите вектор. Вот что я придумал:
for(size_t i = 0; i < myOtherVector.size(); i++)
{
myVector.erase(std::remove(myVector.begin(), myVector.end(), myOtherVector[i]), myVector.end());
}
myOtherVector.clear();
Это приводит к ошибке времени компиляции, потому что myVector
содержит уникальные указатели, но я даю функции remove()
необработанный указатель. Здесь мне нужна помощь, потому что я не знаю, как правильно решить эту проблему. Я изменил строку на:
myVector.erase(std::remove(myVector.begin(), myVector.end(), std::unique_ptr<SomeClass>(myOtherVector[i])), myVector.end());
Во-первых, это неверно, потому что теперь у меня есть два std::unique_ptr
, ссылающихся на один и тот же объект. Элемент внутри myVector
содержит ссылку, а конструкция уникального указателя в приведенной выше строке является еще одной ссылкой. И я даже не знаю, является ли создание нового указателя для получения того же типа концептуально правильным способом сделать это. Итак, я изменил уникальные указатели на общие указатели:
std::vector<std::shared_ptr<SomeClass>> myVector;
std::vector<SomeClass*> myOtherVector;
for(size_t i = 0; i < myOtherVector.size(); i++)
{
myVector.erase(std::remove(myVector.begin(), myVector.end(), std::shared_ptr<SomeClass>(myOtherVector[i])), myVector.end());
}
myOtherVector.clear();
Когда я запустил приложение, строка myVector.erase()
привела к ошибке времени выполнения, в которой говорилось, что «ApplicationName.exe вызвал точку останова». после нажатия кнопки «Продолжить» я получил ошибку утверждения отладки.
Так что, очевидно, я делаю что-то не так, но я не знаю, что. Каков правильный способ стереть интеллектуальный указатель из вектора с помощью необработанного указателя?
std::unique_ptr
имеет членget
, который возвращает принадлежащий указатель. - person James McNellis   schedule 28.02.2013std::shared_ptr
. - person Mark Garcia   schedule 28.02.2013std::vector::clear()
. - person Mark Garcia   schedule 28.02.2013