Trong lập trình C++, thư viện chuẩn cung cấp cho chúng ta nhiều công cụ mạnh mẽ để làm việc với vector. Một trong những thao tác quan trọng khi làm việc với vector là xóa phần tử. Để xóa phần tử khỏi vector, chúng ta thường sử dụng phương pháp erase()
được cung cấp bởi std::vector
. Bài viết này sẽ giúp bạn hiểu rõ hơn về cách sử dụng std::vector::erase()
để thực hiện thao tác này.
Tổng quan về std::vector::erase()
std::vector::erase()
là một thành viên hàm của lớp std::vector
cho phép xóa một hoặc nhiều phần tử khỏi vector. Hàm này có hai dạng sử dụng chính:
- erase(iterator pos): Xóa phần tử tại vị trí chỉ định bởi iterator
pos
. - erase(iterator first, iterator last): Xóa các phần tử trong khoảng từ
first
đếnlast
(không bao gồmlast
).
Xóa một phần tử đơn lẻ
Giả sử chúng ta có một vector các số nguyên và muốn xóa phần tử tại một vị trí cụ thể. Dưới đây là ví dụ minh họa:
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
// Iterator trỏ tới phần tử thứ hai (giá trị 2)
auto it = numbers.begin() + 1;
// Xóa phần tử thứ hai
numbers.erase(it);
// In vector sau khi xóa
for (int num : numbers) {
std::cout << num << " ";
}
return 0;
}
Kết quả đầu ra sẽ là: 1 3 4 5
Xóa một khoảng các phần tử
Nếu muốn xóa một khoảng các phần tử, ta có thể sử dụng phiên bản erase
với hai iterator. Ví dụ, để xóa các phần tử từ vị trí thứ hai đến vị trí thứ tư trong vector, chúng ta thực hiện như sau:
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
// Iterator trỏ tới phần tử thứ hai
auto start = numbers.begin() + 1;
// Iterator trỏ tới phần tử thứ tư
auto end = numbers.begin() + 3;
// Xóa các phần tử từ thứ hai đến thứ tư (không bao gồm thứ tư)
numbers.erase(start, end);
// In vector sau khi xóa
for (int num : numbers) {
std::cout << num << " ";
}
return 0;
}
Kết quả đầu ra sẽ là: 1 4 5
Chú ý khi sử dụng std::vector::erase()
-
Invalidation của Iterator: Sau khi gọi
erase
, tất cả các iterator trỏ tới các phần tử bị xóa trở nên không hợp lệ. Các iterator khác trỏ tới các phần tử sau các phần tử bị xóa sẽ phải được cập nhật. -
Độ phức tạp thời gian: Hàm
erase
có độ phức tạp O(n) với n là số phần tử cần xóa. Điều này là do khi xóa một phần tử, các phần tử sau đó phải được dời chỗ lên một vị trí để lấp khoảng trống.
Ví dụ thêm về xóa phần tử theo giá trị
Nếu muốn xóa tất cả các phần tử có giá trị cụ thể, ta có thể sử dụng kết hợp với hàm remove
từ thư viện <algorithm>
:
#include <iostream>
#include <vector>
#include <algorithm> // cần thiết để sử dụng std::remove
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 3, 5};
// Xóa tất cả các phần tử có giá trị là 3
numbers.erase(std::remove(numbers.begin(), numbers.end(), 3), numbers.end());
// In vector sau khi xóa
for (int num : numbers) {
std::cout << num << " ";
}
return 0;
}
Kết quả đầu ra sẽ là: 1 2 4 5
Phương pháp này chứng tỏ sự mạnh mẽ của C++ khi kết hợp nhiều tính năng của thư viện chuẩn để thực hiện các thao tác phức tạp một cách đơn giản và hiệu quả.
Kết luận
std::vector::erase()
là một công cụ không thể thiếu khi làm việc với vector trong C++. Nó cho phép lập trình viên xóa các phần tử một cách cụ thể và hiệu quả. Hiểu cách sử dụng erase()
cũng như những chú ý đặc biệt khi thao tác với nó sẽ giúp bạn viết mã nguồn C++ rõ ràng và hiệu quả hơn.
Comments