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

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

Hướng dẫn cách xóa 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 list erase C++ để xóa phần tử trong list sau bài học này.

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

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

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

Hàm pop_front là một hàm thành viên trong class std:list, có tác dụng xóa phần tử đầu tiên trong 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 list như sau:

lst.pop_front();

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

Ví dụ cụ thể:

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

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

int main ()
{
list<int> lst{3, 1, 4, 1, 5};
cout << "Before erase" << endl;
dump (lst);

lst.pop_front();
cout << "After erase" << endl;
dump (lst);
return 0;
}

Kết quả:

Before erase
3 1 4 1 5
After erase
1 4 1 5

Có thể thấy phần tử đầu tiên trong list là phần tử 3 đã bị xóa khỏi 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 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 list, hãy sử dụng tới hàm front để thay thế.

Ví dụ:

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

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

Xóa phần tử cuối cùng trong list C++ bằng pop_back

Hàm pop_back là một hàm thành viên trong class std:list, có tác dụng xóa phần tử cuối cùng trong 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_back để xóa phần tử cuối cùng trong list như sau:

lst.pop_back();

Trong đó lst là tên list cần xóa phần tử cuối cùng.

Ví dụ cụ thể:

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

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

int main ()
{
list<int> lst{3, 1, 4, 1, 5};
cout << "Before erase" << endl;
dump (lst);

lst.pop_back();
cout << "After erase" << endl;
dump (lst);
return 0;
}

Kết quả:

Before erase
3 1 4 1 5
After erase
3 1 4 1

Có thể thấy phần tử cuối cùng trong list là phần tử 5 đã bị xóa khỏi list ban đầu.

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

Ví dụ:

list<int> lst{3, 1, 4, 1, 5};
int last = lst.back(); //5

lst.pop_back(); //{3, 1, 4, 1}

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

erase trong c++ là một hàm thành viên trong class std:list, có tác dụng xóa một hoặc nhiều phần tử trong list C++ ở 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 trong list c++ chúng ta sử dụng cú pháp sau đây:

lst.erase(itr);

Trong đó lst là list ban đầu, và itr là trình lặp trỏ đến vị trí cần xóa trong 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 list.

Giống như Kiyoshi đã phân tích tại bài thêm chèn list trong C++ thì để chuyển trình lặp chỉ đến vị trí index thứ n trong 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 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 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 để xóa giá trị ở vị trí đó.

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

lst.erase(itr);

Ví dụ cụ thể:

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

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


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

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

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

return 0;
}

Kết quả:

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

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

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

lst.erase( iterator_first, iterator_last);

Trong đó lst là 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 từ iterator_first đến iterator_last, nghĩa là phần tử ở vị trí iterator_firstiterator_last cũng sẽ 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 <list>
using namespace std;

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


int main ()
{
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 để xóa phạm vi là xong
lst.erase(itr_start, itr_end);
dump(lst);

return 0;
}

Kết quả:

3 1 4 1 5 7 9
3 1 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 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.