У меня есть два вектораКак удалить элементы из вектора заданного другого вектора итераторов
vector<int> vint;
vector<vector<int>::iterator> viter;
Что это лучший способ, чтобы удалить все элементы в vint
которого итераторы присутствуют в viter
. В настоящее время я временно страницы Временное решение перехода к list
Edit: (Некоторые более фона)
Это мой текущий код. Я хотел бы избежать переезда в список и вернуться к вектору
void foo(std::vector<Blah>& bvec)
{
std::list<Blah> blist;
std::move(bvec.begin(), bvec.end(), std::back_inserter(blist));
bvec.clear();
std::vector<std::list<Blah>::iterator> selectedElements;
{
//Critical section which holds a mutex. Should be as fast as possible
for(auto it = blist.begin(), it_end= blist.end(); it != it_end; ++it)
{
if(shouldElementBeRemoved(*it))
selectedElements.push_back(it);
}
}
for(auto& it: selectedElements)
{
if(shouldElementReallyBeRemoved(*it))
blist.erase(it);
}
std::move(blist.begin(), blist.end(), std::back_inserter(bvec));
}
Может быть упрощена без списка, если можно удалить непосредственно из вектора.
void foo(std::vector<Blah>& bvec)
{
std::vector<std::vector<Blah>::iterator> selectedElements;
{
//Critical section which holds a mutex. Should be as fast as possible
for(auto it = bvec.begin(), it_end= bvec.end(); it != it_end; ++it)
{
if(shouldElementBeRemoved(*it))
selectedElements.push_back(it);
}
}
for(auto& it: selectedElements)
{
if(shouldElementReallyBeRemoved(*it))
// bvect.erase(it); //Not safe!
}
}
Это не для меня ясно, что вы имеете в виду под «все элементы в' vint' которых итераторы присутствуют в 'viter'» –
ли эти итераторы фактически собраны из 'vint'? Зачем вам временно копировать их в «список»? Я этого не понимаю. Не работает ли простой (обратный) цикл и 'std :: vector :: erase() 'на' vint'? –
Если итераторы во втором векторе указывают на vint, вы не можете использовать стирание, потому что вы собираетесь аннулировать итераторы. Однако, если итераторы указывают на другой вектор, стирание выполнит задание. –