Menu
CoddyTech

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.

challenge icon

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 n biểu thị số phần tử cần thêm vào vector ban đầu
  • Sau đó là n số nguyên cần chèn vào vector
  • Một số nguyên m biểu thị số phần tử cần xóa
  • Sau đó là m số 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:

  1. Tạo một std::vector<int> rỗng
  2. Đọc số phần tử cần thêm và chèn chúng vào vector bằng .push_back()
  3. In kích thước ban đầu của vector sau khi đã chèn tất cả phần tử
  4. Đọc số phần tử cần xóa
  5. 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
  6. Sau mỗi lần thử xóa, in kích thước hiện tại của vector
  7. 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;
}
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch C++ online