完成copy算法
This commit is contained in:
@@ -73,6 +73,7 @@ TinySTL
|
|||||||
* generate:100%
|
* generate:100%
|
||||||
* generate_n:100%
|
* generate_n:100%
|
||||||
* distance:100%
|
* distance:100%
|
||||||
|
* copy:100%
|
||||||
* 其他组件:
|
* 其他组件:
|
||||||
* circular_buffer:100%
|
* circular_buffer:100%
|
||||||
* bitmap:100%
|
* bitmap:100%
|
||||||
|
|||||||
@@ -576,6 +576,45 @@ namespace TinySTL{
|
|||||||
typedef typename iterator_traits<Iterator>::iterator_category iterator_category;
|
typedef typename iterator_traits<Iterator>::iterator_category iterator_category;
|
||||||
return _distance(first, last, iterator_category());
|
return _distance(first, last, iterator_category());
|
||||||
}
|
}
|
||||||
|
//********** [copy] ******************************
|
||||||
|
//********* [Algorithm Complexity: O(N)] ****************
|
||||||
|
template<class InputIterator, class OutputIterator>
|
||||||
|
OutputIterator __copy(InputIterator first, InputIterator last, OutputIterator result, _true_type){
|
||||||
|
auto dist = distance(first, last);
|
||||||
|
memcpy(result, first, sizeof(*first) * dist);
|
||||||
|
advance(result, dist);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
template<class InputIterator, class OutputIterator>
|
||||||
|
OutputIterator __copy(InputIterator first, InputIterator last, OutputIterator result, _false_type){
|
||||||
|
while (first != last){
|
||||||
|
*result = *first;
|
||||||
|
++result;
|
||||||
|
++first;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
template<class InputIterator, class OutputIterator, class T>
|
||||||
|
OutputIterator _copy(InputIterator first, InputIterator last, OutputIterator result, T*){
|
||||||
|
typedef typename TinySTL::_type_traits<T>::is_POD_type is_pod;
|
||||||
|
return __copy(first, last, result, is_pod());
|
||||||
|
}
|
||||||
|
template <class InputIterator, class OutputIterator>
|
||||||
|
OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result){
|
||||||
|
return _copy(first, last, result, value_type(first));
|
||||||
|
}
|
||||||
|
template<>
|
||||||
|
inline char *copy(char *first, char *last, char *result){
|
||||||
|
auto dist = last - first;
|
||||||
|
memcpy(result, first, sizeof(*first) * dist);
|
||||||
|
return result + dist;
|
||||||
|
}
|
||||||
|
template<>
|
||||||
|
inline wchar_t *copy(wchar_t *first, wchar_t *last, wchar_t *result){
|
||||||
|
auto dist = last - first;
|
||||||
|
memcpy(result, first, sizeof(*first) * dist);
|
||||||
|
return result + dist;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -242,6 +242,23 @@ namespace TinySTL{
|
|||||||
assert(TinySTL::distance(l.begin(), lit) == 5);
|
assert(TinySTL::distance(l.begin(), lit) == 5);
|
||||||
assert(TinySTL::distance(v.begin(), vit) == 5);
|
assert(TinySTL::distance(v.begin(), vit) == 5);
|
||||||
}
|
}
|
||||||
|
void testCopy(){
|
||||||
|
char arr1[] = "hello", res1[6] = { 0 };
|
||||||
|
TinySTL::copy(std::begin(arr1), std::end(arr1), res1);
|
||||||
|
assert(TinySTL::Test::container_equal(arr1, res1));
|
||||||
|
|
||||||
|
wchar_t arr2[] = L"hello", res2[6] = { 0 };
|
||||||
|
TinySTL::copy(std::begin(arr2), std::end(arr2), res2);
|
||||||
|
assert(TinySTL::Test::container_equal(arr2, res2));
|
||||||
|
|
||||||
|
int arr3[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, res3[10] = { 0 };
|
||||||
|
TinySTL::copy(std::begin(arr3), std::end(arr3), res3);
|
||||||
|
assert(TinySTL::Test::container_equal(arr3, res3));
|
||||||
|
|
||||||
|
std::string arr4[3] = { "1", "2", "3" }, res4[3];
|
||||||
|
TinySTL::copy(std::begin(arr4), std::end(arr4), res4);
|
||||||
|
assert(TinySTL::Test::container_equal(arr4, res4));
|
||||||
|
}
|
||||||
|
|
||||||
void testAllCases(){
|
void testAllCases(){
|
||||||
testFill();
|
testFill();
|
||||||
@@ -266,6 +283,7 @@ namespace TinySTL{
|
|||||||
testSort();
|
testSort();
|
||||||
testGenerate();
|
testGenerate();
|
||||||
testDistance();
|
testDistance();
|
||||||
|
testCopy();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -44,6 +44,7 @@ namespace TinySTL{
|
|||||||
void testSort();
|
void testSort();
|
||||||
void testGenerate();
|
void testGenerate();
|
||||||
void testDistance();
|
void testDistance();
|
||||||
|
void testCopy();
|
||||||
|
|
||||||
void testAllCases();
|
void testAllCases();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user