Эффективное удаление элементов из std::vector во время итерации
В сфере программирования на C разработчики часто сталкиваются с проблемой манипулирования std ::vector при обходе его элементов. Хотя итераторы предоставляют удобный механизм для этой задачи, при попытке удалить элементы во время итерации возникает распространенная ошибка.
Рассмотрим сценарий, в котором std::vector<:string> используется для хранения списка пути к файлам. Цель — удалить каждый файл и удалить его путь из вектора. Однако использование традиционных методов, таких как метод Erase(), делает итераторы недействительными после каждого удаления, усложняя дальнейший обход.
Чтобы преодолеть это ограничение, разработчики разработали более эффективный подход. Метод Erase() при вызове не только удаляет назначенный элемент, но и возвращает новый итератор, указывающий на следующий элемент. Это уникальное поведение позволяет плавно продолжить цикл:
std::vector<:string>::iterator iter;
for (iter = m_vPaths.begin(); iter != m_vPaths.end(); ) {
if (::DeleteFile(iter->c_str()))
iter = m_vPaths.erase(iter);
else
iter;
}
В этом фрагменте кода цикл продолжается, как и предполагалось, при этом iter автоматически обновляется, чтобы указывать на следующий допустимый элемент после каждого удаления. Этот эффективный метод устраняет необходимость в дополнительном векторе и упрощает процесс удаления элементов во время итерации.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3