Last active
December 21, 2015 04:15
-
-
Save kimyongin/eee3c495a8f0efb3445d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// sample1.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다. | |
// | |
#include "stdafx.h" | |
#include <iterator> | |
#include <utility> | |
#include <vector> | |
#include <iostream> | |
namespace std | |
{ | |
template <bool use_swap> struct my_iter_swap_impl; | |
template <> | |
struct my_iter_swap_impl<true> | |
{ | |
template <class ForwardIterator1, class ForwardIterator2> | |
static void do_it(ForwardIterator1 i1, ForwardIterator2 i2) | |
{ | |
// i1과 i2가 같은 타입이고, 레퍼런스 타입인 경우에는 속도가 빠른 std::swap을 사용한다. | |
std::cout << "my_iter_swap_impl<true>" << std::endl; | |
std::swap(*i1, *i2); | |
} | |
}; | |
template <> | |
struct my_iter_swap_impl<false> | |
{ | |
template <class ForwardIterator1, class ForwardIterator2> | |
static void do_it(ForwardIterator1 i1, ForwardIterator2 i2) | |
{ | |
// std::swap이 불가능한 경우, 아래의 속도가 느린 swap을 사용한다. | |
std::cout << "my_iter_swap_impl<false>" << std::endl; | |
typename iterator_traits<ForwardIterator1>::value_type tmp = *i1; | |
*i1 = *i2; | |
*i2 = tmp; | |
} | |
}; | |
template <class ForwardIterator1, class ForwardIterator2> | |
void my_iter_swap(ForwardIterator1 i1, ForwardIterator2 i2) | |
{ | |
typedef iterator_traits<ForwardIterator1> traits1; | |
typedef typename traits1::value_type v1; | |
typedef typename traits1::reference r1; | |
typedef iterator_traits<ForwardIterator2> traits2; | |
typedef typename traits2::value_type v2; | |
typedef typename traits2::reference r2; | |
bool const use_swap = std::is_same<v1, v2>::value | |
&& std::is_reference<r1>::value | |
&& std::is_reference<r2>::value; | |
my_iter_swap_impl<use_swap>::do_it(i1, i2); | |
} | |
} | |
int main() | |
{ | |
{ | |
std::vector<int> v = { 1,2,3,4,5 }; | |
std::my_iter_swap(v.begin(), v.end() - 1); | |
for (auto i : v) { std::cout << i << " "; } | |
std::cout << std::endl; | |
} | |
{ | |
std::vector<int> v1 = { 1,2,3,4,5 }; | |
std::vector<long> v2 = { 10,20,30,40,50 }; | |
std::my_iter_swap(v1.begin(), v2.begin()); | |
for (auto i : v1) { std::cout << i << " "; } | |
std::cout << std::endl; | |
} | |
return 0; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment