Я бы определенно не использовал набор - вам не нужно его сортировать, поэтому нет смысла использовать набор. Набор обычно реализован в виде самобалансирующегося дерева, и алгоритм самобалансирующегося в вашем случае ненужен.
Если вы собираетесь выполнить эту операцию один раз, я бы использовал std :: vector с remove_if (из ), за которым следует удаление. Если вы ранее не использовали remove_if, то он проходит и сдвигает все соответствующие элементы вниз, перезаписывая ненужные элементы в процессе. Вы должны следовать за ним со стиранием, чтобы уменьшить размер вектора. Вот так:
std::vector<const char*> files;
files.erase(remove_if(files.begin(), files.end(), RemovePredicate()), files.end());
Написание кода для того же самого с использованием std :: list будет немного сложнее, если вы захотите воспользоваться его свойством времени удаления O (1). Поскольку вы выполняете эту разовую операцию, которая, вероятно, займет так мало времени, что вы даже не заметите ее, я бы порекомендовал сделать это, так как это самый простой способ.
И, честно говоря, я не думаю, что вы увидите такую большую разницу в скорости между подходами std :: list и std :: vector. Векторный подход копирует каждое значение только один раз, так что на самом деле он довольно быстрый, но занимает гораздо меньше места. По моему мнению, переход к std :: list и использование трехкратного пробела оправдано только в том случае, если вы выполняете много операций по добавлению и удалению в течение всего срока службы приложения.