std::list trong C++ với Ví dụ
Danh sách std::là gì?
In C++, std::list đề cập đến một vùng chứa lưu trữ. std:list cho phép bạn chèn và xóa các mục từ bất kỳ đâu. Danh sách std::đượ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 danh sách có thể được truy cập hai chiều và tuần tự.
Danh sách Thư viện Mẫu Tiêu chuẩn không hỗ trợ truy cập ngẫu nhiên nhanh nhưng nó 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ữ.
Tại sao nên sử dụng danh sách std::?
Đây là lý do sử dụng std::List :
- Danh sách std::không tốt hơn so với các vùng chứa chuỗi khác như mảng và vectơ.
- Chúng có hiệu suất tốt hơn trong việc chèn, di chuyển và trích xuất cá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.
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 loại phần tử được chứa. Bạn có thể thay thế T bằng bất kỳ loại dữ liệu nào, ngay cả các loại do người dùng xác định.
- Alloc – Xác định loại đối tượng cấp phát. Đối tượng này sử dụng mẫu lớp cấp phát theo mặc đị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ã:
Giải thích mã:
- 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 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.
- Phần cuối của cơ thể 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ã:
Giải thích mã:
- 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 danh sách. Hãy chứng minh đ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ã:
Giải thích mã:
- 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().
Xóa khỏi danh sách
Có thể xóa các mục khỏi danh sách. Hàm eras() cho phép bạn xóa một mục hoặc một loạt 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 phạm vi, bạn chuyển các vòng lặp bắt đầu và kết thúc. Hãy 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ã:
Giải thích mã:
- 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().
Tổng kết
- Danh sách std::là một vùng chứa lưu trữ.
- Nó cho phép chèn và xóa các mục từ bất cứ đâu vào thời gian không đổi.
- Nó được thực hiện như một liên kết đôi
- Dữ liệu std::list có thể được truy cập hai chiều và tuần tự.
- std::list không hỗ trợ truy cập ngẫu nhiên nhanh. Tuy nhiên, nó 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 của std::list trong các khối bộ nhớ khác nhau.
- Bạn có thể thu nhỏ hoặc mở rộng std::list từ cả hai đầu nếu cần trong thời gian chạy.
- Để chèn các mục vào std::list, chúng ta sử dụng hàm Insert().
- Để xóa các mục khỏi std::list, chúng ta sử dụng hàm erase().