Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

การสร้าง Test Cases ด้วย generate() และ generate_n() ใน C++ STL


การสร้างข้อมูลทดสอบ (test cases) สำหรับอาเรย์มักซับซ้อน C++ STL มีฟังก์ชัน generate() และ generate_n() ใน <algorithm> ช่วยสร้างค่าได้ง่ายและมีประสิทธิภาพ

1. generate(first, last, gen)

กำหนดค่าให้ elements ใน range [first, last) โดยเรียก gen() ซ้ำๆ

#include <bits/stdc++.h>
using namespace std;

int create_random() {
    return (rand() % 1000);
}

int main() {
    srand(time(NULL));
    vector<int> data(15);
    generate(data.begin(), data.end(), create_random);
    for (int i = 0; i < data.size(); i++)
        cout << data[i] << " ";
}

เอาต์พุทตัวอย่าง

449 180 785 629 547 912 581 520 534 778 670 302 345 965 107

2. generate_n(first, n, gen)

กำหนดค่าให้ n elements ตั้งแต่ first โดยเรียก gen() ซ้ำ n ครั้ง

#include <bits/stdc++.h>
using namespace std;

int create_random() {
    return (rand() % 1000);
}

int main() {
    srand(time(NULL));
    vector<int> data(15);
    generate_n(data.begin(), 6, create_random); // เติมแค่ 6 ตัวแรก
    for (int i = 0; i < data.size(); i++)
        cout << data[i] << " ";
}

เอาต์พุทตัวอย่าง

540 744 814 771 254 913 0 0 0 0 0 0 0 0 0

การประยุกต์เพิ่มเติม

  • ใช้ lambda แทน function pointer: generate(v.begin(), v.end(), [](){ return rand()%100; });
  • สร้าง sequence: int i=0; generate(v.begin(), v.end(), [&i](){ return i++; });
  • ร่วมกับ iota สำหรับลำดับเลข: iota(v.begin(), v.end(), 1);

สรุป

generate() เติมทั้ง range, generate_n() เติมแค่ n ตัว ทั้งคู่ยืดหยุ่น รองรับ generator ใดก็ได้ (function, lambda, functor) เหมาะสำหรับสร้าง test data อย่างรวดเร็ว