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

std::list::assign

#include <list>

// Phiên bản 1: Gán các phần tử từ một dãy các giá trị
void assign(size_type count, const value_type& value);

// Phiên bản 2: Gán các phần tử từ một initializer list
void assign(initializer_list<value_type> ilist);

// Phiên bản 3: Gán các phần tử từ một iterator range
template <class InputIterator>
void assign(InputIterator first, InputIterator last);

Gán các phần tử mới cho std::list, thay thế nội dung hiện tại của nó.

Tham số

count

  • Số lượng phần tử cần gán.

value

  • Giá trị của các phần tử cần gán.

ilist

  • initializer_list chứa các phần tử cần gán.

first, last

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

Giá trị trả về

Không có giá trị trả về

Đặc điểm

  1. Thay thế nội dung hiện tại: assign() xóa tất cả các phần tử hiện có trong std::list và thay thế chúng bằng các phần tử mới được chỉ định.
  2. Thay đổi kích thước: assign() thay đổi kích thước của std::list để phù hợp với số lượng phần tử được gán.
  3. Nhiều phiên bản: assign() cung cấp nhiều phiên bản khác nhau để gán giá trị từ các nguồn khác nhau, bao gồm lặp lại một giá trị, initializer_list và iterator range.
  4. Hiệu quả: Việc sử dụng assign() thường hiệu quả hơn so với việc xóa tất cả các phần tử rồi sau đó chèn các phần tử mới vào.
  5. Có thể làm thay đổi iterator: assign() làm thay đổi (vô hiệu) các iterator trỏ đến std::list.
  6. An toàn exception: Nếu exception xảy ra (ví dụ: std::bad_alloc khi cấp phát bộ nhớ cho các phần tử mới, hoặc exception từ constructor của value_type), list sẽ không thay đổi.
  7. Độ phức tạp:
    • Phiên bản 1 và 2: Độ phức tạp tuyến tính theo count hoặc kích thước của initializer_list - O(n).
    • Phiên bản 3: Độ phức tạp tuyến tính theo khoảng cách giữa firstlast - O(n).

Ví dụ

#include <iostream>
#include <list>
#include <vector>

int main() {
std::list<int> mylist;

// Phiên bản 1: Gán 5 phần tử có giá trị 10
mylist.assign(5, 10);
std::cout << "mylist after assign(5, 10):";
for (int x : mylist) std::cout << ' ' << x; // Output: mylist after assign(5, 10): 10 10 10 10 10
std::cout << '\n';

// Phiên bản 2: Gán các phần tử từ initializer list
mylist.assign({2, 4, 6, 8});
std::cout << "mylist after assign({2, 4, 6, 8}):";
for (int x : mylist) std::cout << ' ' << x; // Output: mylist after assign({2, 4, 6, 8}): 2 4 6 8
std::cout << '\n';

// Phiên bản 3: Gán các phần tử từ một vector
std::vector<int> myvector = {1, 3, 5, 7, 9};
mylist.assign(myvector.begin() + 1, myvector.end() - 1);
std::cout << "mylist after assign(myvector.begin() + 1, myvector.end() - 1):";
for (int x : mylist) std::cout << ' ' << x; // Output: mylist after assign(myvector.begin() + 1, myvector.end() - 1): 3 5 7
std::cout << '\n';

return 0;
}

Các hàm liên quan

=Gán nội dung của một std::list khác hoặc một danh sách khởi tạo cho std::list hiện tại.
insertChèn một hoặc nhiều phần tử mới vào một vị trí cụ thể trong std::list