Skip to content

Instantly share code, notes, and snippets.

@kimyongin
Last active December 21, 2015 04:15
Show Gist options
  • Save kimyongin/eee3c495a8f0efb3445d to your computer and use it in GitHub Desktop.
Save kimyongin/eee3c495a8f0efb3445d to your computer and use it in GitHub Desktop.
// 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