std::list trong C++ với Ví dụ
⚡ Tóm tắt thông minh
std::list trong C++ Đây là một cấu trúc dữ liệu dạng chuỗi được triển khai dưới dạng danh sách liên kết đôi, cho phép chèn và xóa nhanh chóng tại bất kỳ vị trí nào, đồng thời lưu trữ các phần tử trong bộ nhớ không liền kề và hỗ trợ truy cập tuần tự hai chiều thay vì truy cập ngẫu nhiên.
Danh sách std::là gì?
In C++`std::list` đề cập đến một vùng chứa dữ liệu. `std::list` cho phép bạn chèn và xóa các mục từ bất kỳ đâu. `std::list` được triển khai dưới dạng danh sách liên kết đôi. Điều này có nghĩa là dữ liệu trong danh sách có thể được truy cập theo hai chiều và tuần tự.
Danh sách Thư viện Mẫu Chuẩn không hỗ trợ truy cập ngẫu nhiên nhanh, nhưng hỗ trợ truy cập tuần tự từ mọi hướng.
Bạn có thể phân tán các thành phần danh sách trong các khối bộ nhớ khác nhau. Thông tin cần thiết để truy cập tuần tự vào dữ liệu được lưu trữ trong một thùng chứa. Danh sách std::có thể mở rộng và thu nhỏ từ cả hai đầu nếu cần trong thời gian chạy. Bộ cấp phát nội bộ tự động đáp ứng các yêu cầu lưu trữ.
Những đặc điểm này đặt ra một câu hỏi thực tế: khi nào bạn thực sự nên sử dụng danh sách?
Tại sao nên sử dụng danh sách std::?
Dưới đây là những lý do nên sử dụng std::list:
- So với các container chứa chuỗi khác như array và vector, std::list hoạt động tốt hơn.
- Chúng có hiệu suất tốt hơn trong việc chèn, di chuyển và xuất.traccác phần tử từ bất kỳ vị trí nào.
- Danh sách std::cũng hoạt động tốt hơn với các thuật toán thực hiện các thao tác đó một cách chuyên sâu.
Khi đã hiểu rõ lý do, bước tiếp theo là cú pháp để khai báo nó.
Cú pháp danh sách
Để xác định danh sách std::, chúng ta phải nhập tập tin tiêu đề. Đây là cú pháp định nghĩa std::list:
template < class Type, class Alloc =allocator<T> > class list;
Dưới đây là mô tả về các tham số trên:
- T – Xác định kiểu dữ liệu của phần tử chứa bên trong. Bạn có thể thay thế T bằng bất kỳ kiểu dữ liệu nào, kể cả các kiểu dữ liệu do người dùng định nghĩa.
- Alloc – Xác định kiểu của đối tượng cấp phát bộ nhớ. Theo mặc định, nó sử dụng mẫu lớp cấp phát bộ nhớ. Nó phụ thuộc vào giá trị và sử dụng mô hình cấp phát bộ nhớ đơn giản.
Ví dụ 1
#include <algorithm> #include <iostream> #include <list> int main() { std::list<int> my_list = { 12, 5, 10, 9 }; for (int x : my_list) { std::cout << x << '\n'; } }
Đầu ra:
Đây là ảnh chụp màn hình của mã:
Code Giải thích:
- Bao gồm tệp tiêu đề thuật toán để sử dụng các chức năng của nó.
- Bao gồm tệp tiêu đề iostream để sử dụng các chức năng của nó.
- Bao gồm tệp tiêu đề danh sách để sử dụng các chức năng của nó.
- Gọi hàm main(). Logic chương trình phải được thêm vào trong phần thân của hàm này.
- Tạo một danh sách có tên my_list với bộ 4 số nguyên.
- Sử dụng vòng lặp for Để tạo một biến vòng lặp x. Biến này sẽ được sử dụng để lặp qua các phần tử trong danh sách.
- In ra các giá trị của danh sách trên bàn điều khiển.
- Kết thúc phần thân của vòng lặp for.
- Phần cuối của hàm main().
C++ Liệt kê các chức năng
Dưới đây là các hàm std::list phổ biến:
| Chức năng | Mô tả Chi tiết |
|---|---|
| chèn() | Hàm này chèn một mục mới vào trước vị trí của các điểm lặp. |
| đẩy_back() | Chức năng này thêm một mục mới vào cuối danh sách. |
| push_front() | Nó thêm một mục mới vào đầu danh sách. |
| pop_front() | Nó xóa mục đầu tiên của danh sách. |
| kích thước() | Hàm này xác định số lượng phần tử danh sách. |
| đằng trước() | Để xác định các mục đầu tiên của danh sách. |
| mặt sau() | Để xác định mục cuối cùng của danh sách. |
| đảo ngược() | Nó đảo ngược các mục danh sách. |
| hợp nhất () | Nó hợp nhất hai danh sách được sắp xếp. |
nhà xây dựng
Đây là danh sách chức năng được cung cấp bởi tập tin tiêu đề:
- Hàm tạo mặc định std::list::list()- Nó tạo ra một danh sách trống, không có phần tử nào.
- Hàm tạo fill std::list::list()- Nó tạo một danh sách có n phần tử và gán giá trị 0 (XNUMX) cho mỗi phần tử.
- Hàm tạo phạm vi std::list::list()- tạo một danh sách có nhiều phần tử trong phạm vi từ đầu đến cuối.
- Hàm tạo sao chép std::list::list()- Nó tạo một danh sách với bản sao của từng phần tử có trong danh sách hiện có.
- Hàm tạo di chuyển std::list::list()- tạo một danh sách với các thành phần của danh sách khác bằng cách sử dụng ngữ nghĩa di chuyển.
- Trình tạo danh sách khởi tạo std::list::list()-Nó tạo một danh sách với các thành phần của danh sách khác bằng cách sử dụng ngữ nghĩa di chuyển.
Ví dụ 2
#include <iostream> #include <list> using namespace std; int main(void) { list<int> l; list<int> l1 = { 10, 20, 30 }; list<int> l2(l1.begin(), l1.end()); list<int> l3(move(l1)); cout << "Size of list l: " << l.size() << endl; cout << "List l2 contents: " << endl; for (auto it = l2.begin(); it != l2.end(); ++it) cout << *it << endl; cout << "List l3 contents: " << endl; for (auto it = l3.begin(); it != l3.end(); ++it) cout << *it << endl; return 0; }
Đầu ra:
Đây là ảnh chụp màn hình của mã:
Code Giải thích:
- Bao gồm tệp tiêu đề iostream để sử dụng các chức năng của nó.
- Bao gồm tệp tiêu đề danh sách để sử dụng các chức năng của nó.
- Bao gồm không gian tên std trong mã để sử dụng các lớp của nó mà không cần gọi nó.
- Gọi hàm main(). Logic chương trình phải được thêm vào trong phần thân của hàm này.
- Tạo một danh sách trống có tên l.
- Tạo một danh sách có tên l1 với bộ 3 số nguyên.
- Tạo một danh sách có tên l2 với tất cả các thành phần trong danh sách có tên l1, từ đầu đến cuối.
- Tạo một danh sách có tên l3 bằng cách sử dụng ngữ nghĩa di chuyển. Danh sách l3 sẽ có nội dung giống như danh sách l2.
- In kích thước của danh sách có tên l trên bảng điều khiển cùng với văn bản khác.
- In một số văn bản trên bảng điều khiển.
- Tạo một trình lặp có tên là nó và sử dụng nó để lặp qua các phần tử của danh sách có tên là l2.
- In các phần tử của danh sách có tên l2 trên bảng điều khiển.
- In một số văn bản trên bảng điều khiển.
- Tạo một trình lặp có tên là nó và sử dụng nó để lặp qua các phần tử của danh sách có tên là l3.
- In các phần tử của danh sách có tên l3 trên bảng điều khiển.
- Chương trình phải trả về giá trị sau khi hoàn thành thành công.
- Phần cuối của hàm main().
Thuộc tính vùng chứa
Dưới đây là danh sách các thuộc tính vùng chứa:
| Bất động sản | Mô tả Chi tiết |
|---|---|
| Trình tự | Các vùng chứa trình tự sắp xếp các phần tử của chúng theo một trình tự tuyến tính nghiêm ngặt. Các phần tử được truy cập theo vị trí của chúng trong chuỗi. |
| Danh sách liên kết đôi | Mọi phần tử đều có thông tin về cách xác định vị trí các phần tử trước và phần tử tiếp theo. Điều này cho phép có thời gian liên tục cho các thao tác chèn và xóa. |
| Nhận biết người phân bổ | Một đối tượng cấp phát được sử dụng để sửa đổi kích thước lưu trữ một cách linh hoạt. |
Chèn vào danh sách
Có nhiều hàm khác nhau mà chúng ta có thể sử dụng để chèn giá trị vào một danh sách. Hãy cùng xem xét điều này:
Ví dụ 3
#include <algorithm> #include <iostream> #include <list> int main() { std::list<int> my_list = { 12, 5, 10, 9 }; my_list.push_front(11); my_list.push_back(18); auto it = std::find(my_list.begin(), my_list.end(), 10); if (it != my_list.end()) { my_list.insert(it, 21); } for (int x : my_list) { std::cout << x << '\n'; } }
Đầu ra:
Đây là ảnh chụp màn hình của mã:
Code Giải thích:
- Bao gồm tệp tiêu đề thuật toán để sử dụng các chức năng của nó.
- Bao gồm tệp tiêu đề iostream để sử dụng các chức năng của nó.
- Bao gồm tệp tiêu đề danh sách để sử dụng các chức năng của nó.
- Gọi hàm main(). Logic chương trình phải được thêm vào trong phần thân của hàm này.
- Tạo một danh sách có tên my_list với bộ 4 số nguyên.
- Chèn phần tử 11 vào trước danh sách có tên my_list.
- Chèn phần tử 18 vào cuối danh sách có tên my_list.
- Tạo một trình vòng lặp và sử dụng nó để tìm phần tử 10 từ danh sách my_list.
- Sử dụng câu lệnh if để xác định xem phần tử trên có được tìm thấy hay không.
- Chèn phần tử 21 trước phần tử trên nếu nó được tìm thấy.
- Kết thúc phần thân của câu lệnh if.
- Sử dụng vòng lặp for để tạo biến vòng lặp x. Biến này sẽ được sử dụng để lặp qua các thành phần trong danh sách.
- In ra các giá trị của danh sách trên bàn điều khiển.
- Kết thúc phần thân của vòng lặp for.
- Phần cuối của hàm main().
Các phần tử được đưa vào danh sách cũng có thể dễ dàng được loại bỏ.
Xóa khỏi danh sách
Có thể xóa các mục khỏi một danh sách. Hàm erase() cho phép bạn xóa một mục hoặc một phạm vi mục khỏi danh sách.
- Để xóa một mục, bạn chỉ cần chuyển một vị trí số nguyên. Mục này sẽ bị xóa.
- Để xóa một vùng nhớ, bạn cần truyền vào con trỏ bắt đầu và con trỏ kết thúc. Chúng ta hãy cùng chứng minh điều này.
Ví dụ 4
#include <algorithm> #include <iostream> #include <list> using namespace std; int main() { std::list<int> my_list = { 12, 5, 10, 9 }; cout << "List elements before deletion: "; for (int x : my_list) { std::cout << x << '\n'; } list<int>::iterator i = my_list.begin(); my_list.erase(i); cout << "\nList elements after deletion: "; for (int x : my_list) { std::cout << x << '\n'; } return 0; }
Đầu ra:
Đây là ảnh chụp màn hình của mã:
Code Giải thích:
- Bao gồm tệp tiêu đề thuật toán để sử dụng các chức năng của nó.
- Bao gồm tệp tiêu đề iostream để sử dụng các chức năng của nó.
- Bao gồm tệp tiêu đề danh sách để sử dụng các chức năng của nó.
- Bao gồm không gian tên std trong chương trình của chúng tôi để sử dụng các lớp của nó mà không cần gọi nó.
- Gọi hàm main(). Logic chương trình phải được thêm vào trong phần thân của hàm này.
- Tạo một danh sách có tên my_list với bộ 4 số nguyên.
- In một số văn bản trên bảng điều khiển.
- Sử dụng vòng lặp for để tạo biến vòng lặp x. Biến này sẽ được sử dụng để lặp qua các thành phần trong danh sách.
- In ra các giá trị của danh sách trên bàn điều khiển.
- Kết thúc phần thân của vòng lặp for.
- Tạo một iterator i trỏ đến phần tử đầu tiên của danh sách.
- Sử dụng hàm erase() được trỏ bởi iterator i.
- In một số văn bản trên bảng điều khiển.
- Sử dụng vòng lặp for để tạo biến vòng lặp x. Biến này sẽ được sử dụng để lặp qua các thành phần trong danh sách.
- In ra các giá trị của danh sách trên bàn điều khiển. Điều này xảy ra sau khi xóa.
- Kết thúc phần thân của vòng lặp for.
- Chương trình phải trả về một giá trị sau khi hoàn thành thành công.
- Phần cuối của hàm main().







