Chuyển tới nội dung chính

std::deque::erase

#include <deque>

// Phiên bản 1: Xóa một phần tử tại vị trí được chỉ định
iterator erase(const_iterator pos);

// Phiên bản 2: Xóa các phần tử trong một phạm vi
iterator erase(const_iterator first, const_iterator last);

Xóa một hoặc nhiều phần tử khỏi deque tại một vị trí cụ thể hoặc trong một phạm vi.

Tham số

pos

  • Iterator trỏ đến phần tử cần xóa. pos phải là một iterator hợp lệ và có thể dereference được trong deque.

first, last

  • Iterator xác định phạm vi các phần tử cần xóa. first trỏ đến phần tử đầu tiên cần xóa, last trỏ đến phần tử sau phần tử cuối cùng cần xóa (past-the-end).

Giá trị trả về

  • Trả về một iterator trỏ đến phần tử theo sau phần tử cuối cùng bị xóa. Nếu không có phần tử nào như vậy (ví dụ: xóa phần tử cuối cùng của deque), hàm trả về end().

Đặc điểm

  1. erase() cho phép bạn xóa một phần tử duy nhất hoặc một dãy các phần tử liên tiếp.
  2. erase() làm giảm kích thước của deque tương ứng với số lượng phần tử bị xóa.
  3. Gọi erase() với posend() hoặc không phải là iterator hợp lệ của deque sẽ dẫn đến hành vi không xác định.
  4. Việc xóa phần tử khỏi deque có thể làm thay đổi (invalidate) các iterator khác đang trỏ đến các phần tử trong deque (bao gồm cả iterator được trả về).
  5. Độ phức tạp:
    • Xóa một phần tử: O(n) trong trường hợp xấu nhất (khi xóa ở đầu), O(1) trong trường hợp tốt nhất (khi xóa ở cuối), với n là số phần tử trong deque. Trung bình là O(min(n, N-n)) với n là khoảng cách từ pos tới đầu deque và N-n là khoảng cách từ pos đến cuối deque.
    • Xóa nhiều phần tử: Độ phức tạp phụ thuộc vào số lượng phần tử bị xóa và vị trí xóa.

Ví dụ

#include <iostream>
#include <deque>

int main() {
std::deque<int> myDeque = {10, 20, 30, 40, 50, 60, 70, 80};

// Phiên bản 1: Xóa phần tử thứ ba (có giá trị 30)
auto it = myDeque.begin() + 2;
myDeque.erase(it);
std::cout << "myDeque after erase(it):";
for (int x : myDeque) std::cout << ' ' << x; // Output: myDeque after erase(it): 10 20 40 50 60 70 80
std::cout << '\n';

// Phiên bản 2: Xóa ba phần tử đầu tiên
myDeque.erase(myDeque.begin(), myDeque.begin() + 3);
std::cout << "myDeque after erase(myDeque.begin(), myDeque.begin() + 3):";
for (int x : myDeque) std::cout << ' ' << x; // Output: myDeque after erase(myDeque.begin(), myDeque.begin() + 3): 50 60 70 80
std::cout << '\n';

// Phiên bản 2: Xóa hai phần tử cuối cùng
myDeque.erase(myDeque.end() - 2, myDeque.end());
std::cout << "myDeque after erase(myDeque.end() - 2, myDeque.end()):";
for (int x : myDeque) std::cout << ' ' << x; // Output: myDeque after erase(myDeque.end() - 2, myDeque.end()): 50 60
std::cout << '\n';

return 0;
}

Các hàm liên quan

pop_backXóa phần tử cuối cùng của deque
insertChèn một hoặc nhiều phần tử mới vào một vị trí cụ thể trong deque