diff --git a/MyTinySTL/vector.h b/MyTinySTL/vector.h index 5192761..bd5f5c0 100644 --- a/MyTinySTL/vector.h +++ b/MyTinySTL/vector.h @@ -78,18 +78,18 @@ class vector vector(size_type n, const value_type& value) { fill_init(n, value); } - + template ::value, int>::type = 0> vector(Iter first, Iter last) { MYSTL_DEBUG(!(last < first)); - range_init(first, last); + range_init(first, last, iterator_category(first)); } vector(const vector& rhs) { - range_init(rhs.begin_, rhs.end_); + range_init(rhs.begin_, rhs.end_, mystl::forward_iterator_tag{}); } vector(vector&& rhs) noexcept @@ -104,7 +104,7 @@ class vector vector(std::initializer_list ilist) { - range_init(ilist.begin(), ilist.end()); + range_init(ilist.begin(), ilist.end(), mystl::forward_iterator_tag{}); } vector& operator=(const vector& rhs); @@ -288,8 +288,12 @@ class vector void init_space(size_type size, size_type cap); void fill_init(size_type n, const value_type& value); + + template + void range_init(Iter first, Iter last, input_iterator_tag); + template - void range_init(Iter first, Iter last); + void range_init(Iter first, Iter last, forward_iterator_tag); void destroy_and_recover(iterator first, iterator last, size_type n); @@ -601,7 +605,7 @@ fill_init(size_type n, const value_type& value) template template void vector:: -range_init(Iter first, Iter last) +range_init(Iter first, Iter last, mystl::forward_iterator_tag) { const size_type len = mystl::distance(first, last); const size_type init_size = mystl::max(len, static_cast(16)); @@ -609,6 +613,17 @@ range_init(Iter first, Iter last) mystl::uninitialized_copy(first, last, begin_); } +template +template +void vector:: +range_init(Iter first, Iter last, mystl::input_iterator_tag) +{ + try_init(); + for (; first != last; ++first) { + emplace_back(*first); + } +} + // destroy_and_recover 函数 template void vector:: diff --git a/Test/vector_test.h b/Test/vector_test.h index 8b79ef6..b5ddb57 100644 --- a/Test/vector_test.h +++ b/Test/vector_test.h @@ -3,10 +3,11 @@ // vector test : 测试 vector 的接口与 push_back 的性能 -#include +#include #include "../MyTinySTL/vector.h" #include "test.h" +#include "stream_iterator.h" // 用于测试 input_iterator 迭代器版构造函数 namespace mystl { @@ -32,7 +33,6 @@ void vector_test() v8 = v3; v9 = std::move(v3); v10 = { 1,2,3,4,5,6,7,8,9 }; - FUN_AFTER(v1, v1.assign(8, 8)); FUN_AFTER(v1, v1.assign(a, a + 5)); FUN_AFTER(v1, v1.emplace(v1.begin(), 0)); @@ -90,6 +90,12 @@ void vector_test() FUN_AFTER(v1, v1.shrink_to_fit()); FUN_VALUE(v1.size()); FUN_VALUE(v1.capacity()); + + std::istringstream is("1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9"); + mystl::istream_iterator beg{is}, end; + mystl::vector v11{beg, end}; + COUT(v11); + PASSED; #if PERFORMANCE_TEST_ON std::cout << "[--------------------- Performance Testing ---------------------]\n";