Xóa phần tử
Thuộc phần Logic và luồng chương trình trong hành trình C++ của Coddy. Bài học 16 trên 56.
Đôi khi bạn cần xóa các phần tử khỏi vector khi không còn cần dùng đến chúng. Với vector, bạn cần dùng một iterator cùng phương thức .erase(). Bạn có thể kết hợp std::find() với .erase() để xóa phần tử theo giá trị.
Đây là cách xóa một phần tử khỏi vector. std::find() thuộc header <algorithm>, vì vậy hãy include nó cùng với <vector>:
#include <algorithm>
#include <vector>
std::vector<int> numbers = {10, 20, 30, 40};
auto it = std::find(numbers.begin(), numbers.end(), 20);
if (it != numbers.end()) {
numbers.erase(it); // Xóa phần tử (element) tại vị trí của bộ lặp (iterator)
}Sau khi gọi erase(), phần tử ở vị trí đó sẽ bị xóa và tất cả phần tử phía sau dịch xuống. Nếu bạn tìm rồi xóa một phần tử không tồn tại, find() sẽ trả về end(). Kiểm tra điều này giúp tránh lỗi.
Mẫu này giúp việc xóa phần tử an toàn và có thể dự đoán. Cách này đặc biệt hữu ích khi duy trì các tập hợp động mà bạn cần xóa những mục cụ thể dựa trên đầu vào của người dùng hoặc logic chương trình. Hãy luôn kiểm tra xem trình lặp có hợp lệ trước khi xóa hay không.
Thử thách
DễTạo một chương trình minh họa cách xóa các phần tử khỏi std::vector bằng phương thức .erase() kết hợp với std::find(). Thử thách này sẽ kiểm tra mức độ hiểu biết của bạn về cách xóa an toàn các phần tử cụ thể khỏi vector và quan sát kết quả.
Chương trình sẽ nhận các đầu vào sau:
- Một số nguyên
nbiểu thị số phần tử cần thêm vào vector ban đầu - Sau đó là
nsố nguyên cần chèn vào vector - Một số nguyên
mbiểu thị số phần tử cần xóa - Sau đó là
msố nguyên biểu thị các phần tử cần xóa khỏi vector
Chương trình của bạn cần:
- Tạo một
std::vector<int>rỗng - Đọc số phần tử cần thêm và chèn chúng vào vector bằng
.push_back() - In kích thước ban đầu của vector sau khi đã chèn tất cả phần tử
- Đọc số phần tử cần xóa
- Với mỗi phần tử cần xóa, dùng
std::find()để tìm phần tử đó, sau đó dùng.erase()để xóa nếu tìm thấy - Sau mỗi lần thử xóa, in kích thước hiện tại của vector
- Cuối cùng, duyệt qua các phần tử còn lại trong vector và in chúng theo thứ tự
Dùng định dạng đầu ra chính xác sau:
Kích thước ban đầu của vector:
Initial size: [size]Sau mỗi lần thử xóa:
After removing [number]: size = [current_size]Các phần tử còn lại cuối cùng:
Remaining elements: [element1] [element2] [element3] ...Hãy nhớ rằng .erase() cần một iterator, vì vậy trước tiên bạn phải dùng std::find() để tìm phần tử. Luôn kiểm tra xem có tìm thấy phần tử hay không trước khi xóa. Dùng vòng lặp for dựa trên phạm vi để in các phần tử còn lại theo thứ tự hiện tại.
Tự làm thử
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
// Đọc số phần tử cần thêm
int n;
cin >> n;
// Tạo một vector rỗng
vector<int> myVector;
// Đọc và thêm n phần tử
for (int i = 0; i < n; i++) {
int element;
cin >> element;
// Thêm phần tử vào vector
}
// Đọc số phần tử cần xóa
int m;
cin >> m;
// TODO: Viết code của bạn bên dưới
// 1. In ra kích thước ban đầu của vector
// 2. Với mỗi phần tử cần xóa, tìm phần tử đó, dùng .erase() rồi in ra kích thước sau mỗi lần xóa
// 3. In ra các phần tử còn lại trong vector
return 0;
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng chương trình
1Con trỏ và bộ nhớ
Con trỏ là gì?Toán tử lấy địa chỉToán tử giải tham chiếuCon trỏ nullCon trỏ và mảngBộ nhớ động với newGiải phóng bộ nhớ với deleteÔn tập: luyện tập về con trỏ2Vector (mảng động)
Giới thiệu std::vectorTạo vectorThêm phần tửTruy cập phần tửKích thước vectorDuyệt bằng vòng lặp forVòng lặp for dựa trên phạm viXóa phần tửÔn tập: các thao tác với vector5Dự án: Công cụ quản lý hàng tồn kho
Thiết lập dự ánThêm và cập nhật mặt hàng3Dự án: Công cụ danh sách công việc
Tổng quan dự ánThêm công việc6Tập hợp (các phần tử duy nhất)
Giới thiệu std::setTạo tập hợp và thêm phần tửKiểm tra phần tửXóa phần tửDuyệt qua tập hợpÔn tập: các số duy nhấtTự luyện tập: Trình biên dịch C++ online