erase
Удаляет один или несколько файлов. Если вы используете удаление файла с диска, его нельзя извлечь.
Эта команда аналогична команде del.
Синтаксис
erase [/p] [/f] [/s] [/q] [/a[:]] del [/p] [/f] [/s] [/q] [/a[:]]
Параметры
- Файлы только для чтения
- H Скрытые файлы
- I Not content indexed files
- Системные файлы
- Файлы, готовые к архивации
- l Reparse points
- — Используется в качестве префикса, что означает «не»
Замечания
- Если вы используете erase /p команду, отобразится следующее сообщение: FileName, Delete (Y/N)? Чтобы подтвердить удаление, нажмите клавишу Y. Чтобы отменить удаление и отобразить следующее имя файла (если вы указали группу файлов), нажмите клавишу N. Чтобы остановить команду удаления , нажмите клавиши CTRL+C.
- Если отключить расширение команды, параметр /s отобразит имена всех файлов, которые не найдены, вместо отображения имен удаленных файлов.
- При указании определенных папок в параметре все включенные файлы также будут удалены. Например, если вы хотите удалить все файлы в папке \work , введите:
erase \work
erase *.*
Команда удаления отображает следующую строку: Are you sure (Y/N)? Чтобы удалить все файлы в текущем каталоге, нажмите клавишу Y и нажмите клавишу ВВОД. Чтобы отменить удаление, нажмите клавишу N и нажмите клавишу ВВОД.
Примечание. Прежде чем использовать дикие карта символы с командой удаления, используйте те же дикие карта символы с командой dir, чтобы перечислить все файлы, которые будут удалены.
Примеры
Чтобы удалить все файлы в папке с именем Test на диске C, введите одно из следующих элементов:
erase c:\test erase c:\test\*.*
Чтобы удалить все файлы с расширением имени файла .bat из текущего каталога, введите:
erase *.bat
Чтобы удалить все файлы только для чтения в текущем каталоге, введите следующее:
erase /a:r *.*
Дополнительные ссылки
- Условные обозначения синтаксиса команд командной строки
- команда del
Как работает erase в c
Идиома remove-erase idiom призвана решить проблему удаления элементов из контейнера, поскольку данная проблема может представлять нетривиальную задачу, чреватую возникновением ошибок. Данная идиома предполагает применение алгоритма remove() или remove_if() , за которым следует вызов функции erase() контейнера.
При применении алгоритмов remove() и remove_if() те элементы, которые надо сохранить, помещаются в начало контейнера, а функции remove() и remove_if() возвращают итератор на первый удаляемый элемент. Затем этот итератор передается в функцию erase() , которая собственно и удаляет элементы. Реализация идиомы:
#include #include #include void print (const std::vector& data) < for(const auto& n: data) < std::cout std::cout bool is_negative(int n) < return n < 0;>int main() < std::vectornumbers ; // применяем алгоритм remove_if() для удаления всех элементов, которые не соответствуют условию auto iter< std::remove_if(begin(numbers), end(numbers), is_negative) >; print(numbers); // 0 1 2 3 4 5 1 2 3 4 5 // удаляем все элементы, начиная с итератора first_to_erase numbers.erase(iter, end(numbers)); print(numbers); // 0 1 2 3 4 5 >
Здесь для примера удаляем из вектора все отрицательные числа. Для этого сначала вызываем функцию std::remove_if() :
auto iter< std::remove_if(begin(numbers), end(numbers), is_negative) >; print(numbers);
В качестве первого и второго параметров она принимает итераторы на начало и конец диапазона, из которого надо удалить числа. Здесь диапазон определяется итераторами на начало и конец вектора. В качестве третьего параметра передается условие. Условие должно представлять функцию, которая принимает некоторое значение и возвращает значение типа bool — true , если значение соответствует условию, и false — если не соответствует. В данном случае в качестве такого условия передаем функцию is_negative, которая вычисляет, является ли число отрицательным. То есть мы удаляем отрицательные числа.
Для вывода вектора на консоль применяется функция print. После выполнения remove_if на консоль будет выведено
0 1 2 3 4 5 1 2 3 4 5
В результате remove_if() просто перемещает все элементы, которые нужно сохранить (0 и положительные числа), в начало диапазона. При этом часть из этих чисел остается в конце вектора, но это не имеет значения, поскольку эта часть вектора будет удалена. А сама функция возвращает итератор iter, который указывает на первый удаляемый элемент. Далее удаляем все элементы, которые начинаются с этого итератора:
numbers.erase(iter, end(numbers)); print(numbers);
Теперь консольный вывод будет следующим:
0 1 2 3 4 5
std::erase_if()
Поскольку безопасное удаление из контейнеров представляет довольно часто встречаемую задачу, то начиная со стандарта C++20 в язык С++ были добавлены функции std::erase() и std::erase_if()
Функция std::erase() удаляет отдельное значение из контейнера (не применяется к std::set и std::map):
std::erase(Container, Value)
Функция std::erase_if() удаляет значения из контейнера, которые соответствуют условию:
std::erase_if(Container, Function)
Так, перепишем предыдущий пример с помощью функции std::erase_if :
#include #include void print (const std::vector& data) < for(const auto& n: data) < std::cout std::cout bool is_negative(int n) < return n < 0;>int main() < std::vectornumbers ; std::erase_if(numbers, is_negative); print(numbers); // 0 1 2 3 4 5 >
Как работает erase в c
Для добавления элементов в вектор применяется функция push_back() , в которую передается добавляемый элемент:
#include #include int main() < std::vectornumbers; // пустой вектор numbers.push_back(5); numbers.push_back(3); numbers.push_back(10); for(int n : numbers) cout << n << "\t"; // 5 3 10 std::cout
Векторы являются динамическими структурами в отличие от массивов, где мы скованы его заданым размером. Поэтому мы можем динамически добавлять в вектор новые данные.
Функция emplace_back() выполняет аналогичную задачу — добавляет элемент в конец контейнера:
std::vector numbers< 1, 2, 3, 4, 5 >; numbers.emplace_back(8); // numbers = < 1, 2, 3, 4, 5, 8 >;
Добавление элементов на определенную позицию
Ряд функций позволяет добавлять элементы на определенную позицию.
- emplace(pos, value) : вставляет элемент value на позицию, на которую указывает итератор pos
- insert(pos, value) : вставляет элемент value на позицию, на которую указывает итератор pos, аналогично функции emplace
- insert(pos, n, value) : вставляет n элементов value начиная с позиции, на которую указывает итератор pos
- insert(pos, begin, end) : вставляет начиная с позиции, на которую указывает итератор pos, элементы из другого контейнера из диапазона между итераторами begin и end
- insert(pos, values) : вставляет список значений начиная с позиции, на которую указывает итератор pos
std::vector numbers< 1, 2, 3, 4, 5 >; auto iter = numbers.cbegin(); // константный итератор указывает на первый элемент numbers.emplace(iter + 2, 8); // добавляем после второго элемента numbers = < 1, 2, 8, 3, 4, 5>;
std::vector numbers1< 1, 2, 3, 4, 5 >; auto iter1 = numbers1.cbegin(); // константный итератор указывает на первый элемент numbers1.insert(iter1 + 2, 8); // добавляем после второго элемента //numbers1 = < 1, 2, 8, 3, 4, 5>; std::vector numbers2 < 1, 2, 3, 4, 5 >; auto iter2 = numbers2.cbegin(); // константный итератор указывает на первый элемент numbers2.insert(iter2 + 1, 3, 4); // добавляем после первого элемента три четверки //numbers2 = < 1, 4, 4, 4, 2, 3, 4, 5>; std::vector values < 10, 20, 30, 40, 50 >; std::vector numbers3 < 1, 2, 3, 4, 5 >; auto iter3 = numbers3.cbegin(); // константный итератор указывает на первый элемент // добавляем после первого элемента три первых элемента из вектора values numbers3.insert(iter3 + 1, values.begin(), values.begin() + 3); //numbers3 = < 1, 10, 20, 30, 2, 3, 4, 5>; std::vector numbers4 < 1, 2, 3, 4, 5 >; auto iter4 = numbers4.cend(); // константный итератор указывает на позицию за последним элементом // добавляем в конец вектора numbers4 элементы из списка < 21, 22, 23 >numbers4.insert(iter4, < 21, 22, 23 >); //numbers4 = < 1, 2, 3, 4, 5, 21, 22, 23>;
Удаление элементов
Если необходимо удалить все элементы вектора, то можно использовать функцию clear :
std::vector v < 1,2,3,4 >; v.clear();
Функция pop_back() удаляет последний элемент вектора:
std::vector v < 1,2,3,4 >; v.pop_back(); // v =
Если нужно удалить элемент из середины или начала контейнера, применяется функция std::erase() , которая имеет следующие формы:
- erase(p) : удаляет элемент, на который указывает итератор p. Возвращает итератор на элемент, следующий после удаленного, или на конец контейнера, если удален последний элемент
- erase(begin, end) : удаляет элементы из диапазона, на начало и конец которого указывают итераторы begin и end. Возвращает итератор на элемент, следующий после последнего удаленного, или на конец контейнера, если удален последний элемент
std::vector numbers1 < 1, 2, 3, 4, 5, 6 >; auto iter = numbers1.cbegin(); // указатель на первый элемент numbers1.erase(iter + 2); // удаляем третий элемент // numbers1 = < 1, 2, 4, 5, 6 >std::vector numbers2 = < 1, 2, 3, 4, 5, 6 >; auto begin = numbers2.cbegin(); // указатель на первый элемент auto end = numbers2.cend(); // указатель на последний элемент numbers2.erase(begin + 2, end — 1); // удаляем с третьего элемента до последнего // numbers2 =
Также начиная со стандарта С++20 в язык была добавлена функция std::erase() . Она не является частью типа vector. В качестве первого параметра она принимает вектор, а в качестве второго — элемент, который надо удалить:
std::vector numbers3 < 1, 2, 3, 1, 5, 6 >; std::erase(numbers3, 1); // numbers3 =
В данном случае удаляем из вектора numbers3 все вхождения числа 1.
Размер вектора
С помощью функции size() можно узнать размер вектора, а с помощью функции empty() проверить, путой ли вектор:
#include #include int main() < std::vectornumbers; if(numbers.empty()) std::cout
С помощью функции resize() можно изменить размер вектора. Эта функция имеет две формы:
- resize(n) : оставляет в векторе n первых элементов. Если вектор содержит больше элементов, то его размер усекается до n элементов. Если размер вектора меньше n, то добавляются недостающие элементы и инициализируются значением по умолчанию
- resize(n, value) : также оставляет в векторе n первых элементов. Если размер вектора меньше n, то добавляются недостающие элементы со значением value
std::vector numbers1 < 1, 2, 3, 4, 5, 6 >; numbers1.resize(4); // оставляем первые четыре элемента — numbers1 = numbers1.resize(6, 8); // numbers1 =
Важно учитывать, что применение функции resize может сделать некорректными все итераторы, указатели и ссылки на элементы.
Изменение элементов вектора
Функция assign() позволяет заменить все элементы вектора определенным набором:
std::vector langs = < "Java", "JavaScript", "C">; langs.assign(4, «C++»); // langs =
В данном случае элементы вектора заменяются набором из четырех строк «C++».
Также можно передать непосредственно набор значений, который заменит значения вектора:
std::vector langs< "Java", "JavaScript", "C">; langs.assign(< "C++", "C#", "C">); // langs =
Еще одна функция — swap() обменивает значения двух контейнеров:
std::vector clangs < "C++", "C#", "Java" >; std::vector ilangs < "JavaScript", "Python", "PHP">; clangs.swap(ilangs); // clangs = < "JavaScript", "Python", "PHP">; for(std::string lang : clangs)
Сравнение векторов
Векторы можно сравнивать — они поддерживают все операции сравнения: , =, ==, !=. Сравнение контейнеров осуществляется на основании сравнения пар элементов на тех же позициях. Векторы равны, если они содержат одинаковые элементы на тех же позициях. Иначе они не равны:
std::vector v1 ; std::vector v2 ; std::vector v3 ; bool v1v2 = v1 == v2; // true bool v1v3 = v1 != v3; // true bool v2v3 = v2 == v3; // false
Как удалить подстроку из строки методом erase? c++ [закрыт]
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.
Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.
Закрыт 2 года назад .
Для заполнения стека нужно ввести «push какое-то число«». Я записываю это в строку, затем пытаюсь удалить из нее подстроку начиная с 0-ого символа по 4-ый символ, чтобы строка содержала только число, которое я позже преобразую к int и благополучно запихаю в стек. Что я делаю не так? Пробовал также str = str.erase (0,3)
#include #include int main() < using namespace std; string str = ""; cin >> str; str.erase(0, 4); cout