diff --git a/README.md b/README.md index ced52cf29f3a9abd00756a31a4aec253b0c71c2a..7dee734ee5aa6f8e0a69795dc4f2568a6c7aa715 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,7 @@ TinySTL * advance:100% * sort:100% * generate:100% + * generate_n:100% * distance:100% * 其他组件: * circular_buffer:100% diff --git a/TinySTL/Algorithm.h b/TinySTL/Algorithm.h index b1c8333aaebdcf8745a7e1ca75d153f93a39ee1c..8f79f2c533b48b2272f5e3f74a3e2f2fa85f1e60 100644 --- a/TinySTL/Algorithm.h +++ b/TinySTL/Algorithm.h @@ -544,6 +544,15 @@ namespace TinySTL{ *first = func(); } } + //********** [generate_n] ****************************** + //********* [Algorithm Complexity: O(N)] **************** + template + void generate_n(OutputIterator first, Size n, Generator gen){ + while (n--){ + *first = gen(); + ++first; + } + } //********** [distance] ****************************** //********* [Algorithm Complexity: O(N)] **************** template diff --git a/TinySTL/Test/AlgorithmTest.cpp b/TinySTL/Test/AlgorithmTest.cpp index b130c4a00452e9198c8a31ffda297808bbeafb6c..fe1c09bd8c48167ff78859c4a0952433940527c7 100644 --- a/TinySTL/Test/AlgorithmTest.cpp +++ b/TinySTL/Test/AlgorithmTest.cpp @@ -221,6 +221,14 @@ namespace TinySTL{ std::generate(std::begin(arr2), std::end(arr2), func); } assert(TinySTL::Test::container_equal(arr1, arr2)); + + int n1 = 0, n2 = 0; + auto gen1 = [&n1](){return n1++; }; + auto gen2 = [&n2](){return n2++; }; + int arr3[100], arr4[100]; + TinySTL::generate_n(arr3, 100, gen1); + std::generate_n(arr4, 100, gen2); + assert(TinySTL::Test::container_equal(arr3, arr4)); } void testDistance(){ TinySTL::list l(10, 0);