«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как безопасно удалить элементы из std::vector во время итерации?

Как безопасно удалить элементы из std::vector во время итерации?

Опубликовано 14 ноября 2024 г.
Просматривать:854

How to Safely Remove Elements from a std::vector While Iterating?

Эффективное удаление элементов из 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