Xóa phần tử trong forward_list C++ | Laptrinhcanban.com

Xóa phần tử trong forward_list C++

Hướng dẫn cách xóa forward_list trong C++. Bạn sẽ học được cách sử dụng các hàm như hàm pop_front(), pop_back cũng như hàm forward_list erase_after C++ để xóa phần tử trong forward_list sau bài học này.

Chúng ta có 3 phương pháp để xóa forward_list trong C++ như sau:

  • Hàm pop_front : Xóa phần tử đầu tiên trong forward_list
  • forward_list erase_after C++: Xóa phần tử tại vị trí chỉ định
  • Hàm erase_after(first, last): Xóa các phần tử trong phạm vi chỉ định

Lưu ý là khác với list thì do forward_list là danh sách một chiều nên không tồn tại hàm pop_back để thêm phần tử vào cuối forward_list.

Xóa phần tử đầu tiên trong forward_list C++ bằng pop_front

Hàm pop_front là một hàm thành viên trong class std:forward_list, có tác dụng xóa phần tử đầu tiên trong forward_list cũng như giảm độ dài của nó đi một đơn vị.

Cú pháp sử dụng hàm pop_front để xóa phần tử đầu tiên trong forward_list như sau:

f_lst.pop_front();

Trong đó f_lst là tên forward_list cần xóa phần tử đầu tiên.

Ví dụ cụ thể:

#include <iostream>
#include <forward_list>
using namespace std;

//Tạo hàm xuất forward_list
void dump(forward_list<int>& f_lst)
{
for (auto x: f_lst) {
cout << " "<< x ;
}
cout << endl;
}

int main ()
{
forward_list<int> f_lst{3, 1, 4, 1, 5};
cout << "Before erase_after" << endl;
dump (f_lst);

f_lst.pop_front();
cout << "After erase_after" << endl;
dump (f_lst);
return 0;
}

Kết quả:

Before erase_after
3 1 4 1 5
After erase_after
1 4 1 5

Có thể thấy phần tử đầu tiên trong forward_list là phần tử 3 đã bị xóa khỏi forward_list ban đầu.

Hàm pop_front thuộc kiểu void, do đó nó sẽ không trả giá trị. Bởi vậy nó sẽ xóa phần tử đầu tiên trong forward_list chứ không trả về phần tử đó. Trong trường hợp muốn lấy phần tử đầu tiên trong forward_list, hãy sử dụng tới hàm front để thay thế.

Ví dụ:

forward_list<int> f_lst{3, 1, 4, 1, 5};
int last = f_lst.front(); //3

f_lst.pop_front(); //{1, 4, 1, 5}

Xóa 1 phần tử trong forward_list bằng hàm erase_after c++

erase_after trong c++ là một hàm thành viên trong class std:forward_list, có tác dụng xóa một hoặc nhiều phần tử trong forward_list C++ ở đằng sau vị trí chỉ định cũng như làm giảm độ dài tương ứng của nó.

Để xóa 1 phần tử tại vị trí chỉ định bằng hàm erase_after trong forward_list c++ chúng ta sử dụng cú pháp sau đây:

lst.erase_after(itr);

Trong đó lst là forward_list ban đầu, và itr là trình lặp trỏ đến vị trí cần xóa trong forward_list.

Ở đây trình lặp (iterator) là một vòng lặp có tác dụng giống như con trỏ, giúp truy cập đến các phần tử ở vị trí cụ thể trong forward_list.

Giống như Kiyoshi đã phân tích tại bài thêm chèn forward_list trong C++ thì để chuyển trình lặp chỉ đến vị trí index thứ n trong forward_list, chúng ta không thể đơn giản cộng vào n vào trình lặp, mà cần phải di chuyển lần lượt qua từng vị trí, bằng toán tử ++ với đủ số vòng lặp.

Ví dụ, trong trường hợp cần chỉ đến vị trí index thứ 5 trong forward_list, chúng ta sẽ viết trình lặp p như sau:

int n = 5;
auto itr = lst.begin(); //Trình lặp trỏ đến vị trí đầu forward_list
for (int i=1; i <= n; i++ )
++itr;

Sau khi đã dịch chuyển trình lặp tới vị trí chỉ định cần xóa phần tử, chúng ta có thể đơn giản sử dụng hàm erase_after để xóa giá trị ở đằng sau vị trí đó.

auto itr = lst.begin(); 
for (int i=1; i <= n; i++ )
++itr;

lst.erase_after(itr);

Ví dụ cụ thể:

#include <iostream>
#include <forward_list>
using namespace std;

//Tạo hàm xuất forward_list
void dump(forward_list<int>& lst)
{
for (auto x: lst) {
cout << " "<< x ;
}
cout << endl;
}


int main ()
{
forward_list<int> lst{3, 1, 4, 1, 5, 7, 9};
dump(lst);
int n;

//Xóa phần tử ở đằng sau vị trí thứ 2
n=2;
auto itr = lst.begin();
for (int i=1; i <= n; i++ )
++itr;
lst.erase_after(itr);
dump(lst);

//Xóa phần tử ở đằng sau vị trí thứ 3
n=3;
itr = lst.begin();
for (int i=1; i <= n; i++ )
++itr;
lst.erase_after(itr);
dump(lst);

return 0;
}

Kết quả:

3 1 4 1 5 7 9
3 1 4 5 7 9
3 1 4 5 9

Xóa các phần tử trong một phạm vi chỉ định bằng forward_list erase_after c++

Chúng ta sử dụng forward_list erase_after c++ để xóa các phần tử trong một phạm vi chỉ định của một forward_list với cú pháp sau đây:

lst.erase_after( iterator_first, iterator_last);

Trong đó lst là forward_list ban đầu, iterator_firstiterator_last là các trình lặp trỏ đến phạm vi bắt đầu và kết thúc xóa.

Lưu ý là phạm vi xóa sẽ được tính trong khoảng giữa iterator_firstiterator_last, nghĩa là phần tử ở vị trí iterator_firstiterator_last sẽ không bị xóa đi.

Và để chỉ định trình lặp tới các phạm vi đó thì chúng ta cũng sử dụng cách tăng tuần tự trình lặp như ở phần trên.

Ví dụ cụ thể:

#include <iostream>
#include <forward_list>
using namespace std;

//Tạo hàm xuất forward_list
void dump(forward_list<int>& lst)
{
for (auto x: lst) {
cout << " "<< x ;
}
cout << endl;
}


int main ()
{
forward_list<int> lst{3, 1, 4, 1, 5, 7, 9};
dump(lst);
int n;
/*Khai báo phạm vi cần xóa*/
int start = 2, end =5;

/*Tạo các trình lặp trỏ tới start và end với giá trị ban đầu*/
auto itr_start = lst.begin();
auto itr_end = lst.begin();

/*Thay đổi trình lặp tương ứng tới các vị trí start và end*/
for (int i=1; i <= start; i++ )
++itr_start;
for (int i=1; i <= end; i++ )
++itr_end;

//Sau đó dùng hàm erase_after để xóa phạm vi là xong
lst.erase_after(itr_start, itr_end);
dump(lst);

return 0;
}

Kết quả:

3 1 4 1 5 7 9
3 1 4 7 9

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn về cách xóa phần tử trong forward_list C++ rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C++ trong các bài học tiếp theo.

Hãy chia sẻ và cùng lan tỏa kiến thức lập trình Nhật Bản tại Việt Nam!

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.