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

std::generate_n

#include <algorithm>

template <class OutputIterator, class Size, class Generator>
OutputIterator generate_n (OutputIterator first, Size n, Generator gen);

Gá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.

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ị.

gen

  • Một hàm hoặc đối tượng hàm (generator) không nhận đối số và trả về giá trị để 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), generate_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. generate_n() ghi đè giá trị hiện tại của các phần tử.
  3. generate_n() trả về iterator trỏ đến sau phần tử cuối cùng được gán giá trị.
  4. gen phải là một hàm hoặc đối tượng hàm không nhận đối số và trả về giá trị có kiểu tương thích để gán được cho kiểu phần tử trong container.
  5. generate_n() yêu cầu OutputIterator, cho phép ghi giá trị mới lên các phần tử mà nó trỏ đến.
  6. generate_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ác giá trị được sinh ra theo một quy luật.
    • Bạn muốn ghi đè lên một phần cụ thể của container bằng các giá trị được sinh ra, 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 sinh ra bởi gen vào container, sử dụng các OutputIterator đặc biệt như std::back_inserter.
Phân biệt với generate()
  • generate() gán giá trị cho tất cả các phần tử trong phạm vi được chỉ định bởi firstlast.
  • generate_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>

// Đối tượng hàm sinh số ngẫu nhiên trong khoảng [min, max]
class RandomNumberGenerator {
public:
RandomNumberGenerator(int min, int max) : min_(min), max_(max) {}
int operator()() {
return min_ + std::rand() % (max_ - min_ + 1);
}
private:
int min_;
int max_;
};

int main() {
std::vector<int> numbers(10);

// Gán 5 số ngẫu nhiên (từ 1 đến 100) cho 5 phần tử đầu tiên của numbers
RandomNumberGenerator rng(1, 100);
std::generate_n(numbers.begin(), 5, rng);

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

std::vector<int> values;

// Thêm 4 số Fibonacci vào cuối vector values
FibonacciGenerator fibGen;
std::generate_n(std::back_inserter(values), 4, fibGen);

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

return 0;
}

Các hàm liên quan

generateGán các giá trị được sinh ra bởi một hàm (hoặc đối tượng hàm) cho các phần tử trong một phạm vi (range) được chỉ định
fill_nGá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
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