std::remove
#include <algorithm>
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
Di chuyển các phần tử không bị "xóa" lên đầu phạm vi, và trả về một iterator trỏ đến phần tử ngay sau phần tử cuối cùng của dãy mới (dãy không chứa các phần tử bị "xóa"). Các phần tử sau vị trí này đến cuối container sẽ có giá trị không xác định.
Tham số
first
- Forward Iterator trỏ đến phần tử đầu tiên trong phạm vi cần xóa.
last
- Forward Iterator trỏ đến phần tử ngay sau phần tử cuối cùng trong phạm vi cần xóa. Phạm vi là
[first, last)
.
val
- Giá trị của các phần tử cần "xóa".
Giá trị trả về
- Forward Iterator trỏ đến phần tử ngay sau phần tử cuối cùng của dãy mới (dãy không chứa các phần tử bị "xóa").
Đặc điểm
remove()
không thay đổi kích thước của container. Nó chỉ di chuyển các phần tử.remove()
sử dụng toán tử==
để so sánh các phần tử vớival
.- Phạm vi [first, last) là "nửa mở", không bao gồm phần tử
last
. remove()
yêu cầu Forward Iterator, cho phép di chuyển một chiều về phía trước.- Để xóa thực sự các phần tử, bạn cần sử dụng phương thức
erase()
của container (như trong ví dụ). Đây được gọi là erase-remove idiom. - Các phần tử sau vị trí mà giá trị trả về của
remove()
trỏ tới cho đến cuối container sẽ có giá trị không xác định. remove()
thường được sử dụng kết hợp với phương thứcerase()
của container để xóa thực sự các phần tử khỏi container. Một cách sử dụng phổ biến là erase-remove idiom.
Phân biệt với remove_if()
remove()
"xóa" các phần tử có giá trị bằng vớival
.remove_if()
"xóa" các phần tử thỏa mãn một điều kiện (được xác định bởi một hàm vị từ).
Ví dụ
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
int main() {
std::vector<int> numbers = {1, 2, 0, 3, 0, 4, 0, 5};
// Di chuyển các phần tử khác 0 lên đầu, trả về iterator đến phần tử ngay sau số 5
auto it = std::remove(numbers.begin(), numbers.end(), 0);
std::cout << "numbers after remove: ";
for (auto i = numbers.begin(); i != numbers.end(); ++i) {
std::cout << *i << " ";
}
std::cout << std::endl;
std::cout << "New logical end: " << (it - numbers.begin()) << std::endl;
// Xóa các phần tử từ it đến cuối vector
numbers.erase(it, numbers.end());
std::cout << "numbers after erase: ";
for (int x : numbers) {
std::cout << x << " ";
}
std::cout << std::endl;
std::string str = "This string has extra spaces.";
// Di chuyển các ký tự khác khoảng trắng lên đầu, trả về iterator đến sau ký tự '.'
auto strIt = std::remove(str.begin(), str.end(), ' ');
// Xóa các ký tự từ strIt đến cuối chuỗi
str.erase(strIt, str.end());
std::cout << "str after erase-remove: " << str << std::endl;
return 0;
}
Các hàm liên quan
remove_if | Di chuyển các phần tử không thỏa mãn điều kiện lên đầu phạm vi, và trả về một iterator trỏ đến phần tử ngay sau phần tử cuối cùng của dãy mới |
remove_copy | Sao chép các phần tử từ một phạm vi (range) nguồn sang một phạm vi đích khác |
replace | Thay thế tất cả các lần xuất hiện của một giá trị cũ bằng một giá trị mới trong một phạm vi (range) |
count | Đếm số lần xuất hiện của một giá trị cụ thể trong một phạm vi được chỉ định |
find | Tìm kiếm phần tử đầu tiên trong một phạm vi có giá trị bằng với một giá trị cho trước |