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

std::fill_n

#include <algorithm>

template <class OutputIterator, class Size, class T>
OutputIterator fill_n (OutputIterator first, Size n, const T& val);

Gán một giá trị cho n phần tử liên tiếp, bắt đầu từ một vị trí được chỉ định.

Tham số

first

  • Output Iterator trỏ đến phần tử đầu tiên trong phạm vi nơi sẽ bắt đầu gán giá trị.

n

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

val

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

Giá trị trả về

  • Output Iterator trỏ đến phần tử ngay sau phần tử cuối cùng được gán giá trị.

Đặc điểm

  1. n phải là số nguyên không âm. Nếu n lớn hơn kích thước của container (tính từ first), fill_n() có thể ghi ra ngoài phạm vi của container, dẫn đến hành vi không xác định.
  2. fill_n() ghi đè giá trị hiện tại của các phần tử.
  3. fill_n() trả về iterator trỏ đến sau phần tử cuối cùng được gán giá trị.
  4. fill_n() yêu cầu OutputIterator ở tham số first, cho phép ghi giá trị mới lên các phần tử mà nó trỏ đến.
  5. fill_n() thường được sử dụng khi:
    • Bạn muốn khởi tạo một số lượng phần tử nhất định trong container với cùng một giá trị.
    • Bạn muốn ghi đè lên một phần cụ thể của container bằng một giá trị, không cần quan tâm đến kích thước thực tế của container.
    • Bạn muốn chèn n phần tử có giá trị giống nhau vào container, sử dụng các OutputIterator đặc biệt như std::back_inserter.
Phân biệt với fill_n()
  • fill() gán giá trị cho tất cả các phần tử trong phạm vi được chỉ định bởi firstlast.
  • fill_n() gán giá trị cho n phần tử, bắt đầu từ first, không cần last.

Ví dụ

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main() {
std::vector<int> numbers(10); // Vector 10 phần tử, giá trị mặc định

// Gán giá trị 7 cho 5 phần tử đầu tiên
std::fill_n(numbers.begin(), 5, 7);

std::cout << "numbers after fill_n: ";
for (int x : numbers) {
std::cout << x << " ";
}
std::cout << std::endl;

char buffer[20] = {0}; // Mảng 20 ký tự, khởi tạo bằng 0

// Gán ký tự 'A' cho 8 phần tử, bắt đầu từ phần tử thứ 3
std::fill_n(buffer + 2, 8, 'A');

std::cout << "buffer after fill_n: ";
for (int i = 0; i < 20; i++) {
std::cout << buffer[i] << " ";
}
std::cout << std::endl;

std::vector<int> values;

// Thêm 4 số 9 vào cuối vector values
std::fill_n(std::back_inserter(values), 4, 9);

std::cout << "values after fill_n with back_inserter: ";
for (int x : values) {
std::cout << x << " ";
}
std::cout << std::endl;

return 0;
}

Các hàm liên quan

fillGán một giá trị cho tất cả các phần tử trong một phạm vi (range) được chỉ định
generate_nGán các giá trị được sinh ra bởi một hàm (hoặc đối tượng hàm) cho n phần tử liên tiếp, bắt đầu từ một vị trí được chỉ định
replaceThay thế tất cả các lần xuất hiện của một giá trị cũ bằng một giá trị mới trong một phạm vi (range)
for_eachÁp dụng một hàm (hoặc đối tượng hàm) cho mỗi phần tử trong một phạm vi được chỉ định