5. C++のインターフェース(1/2)
~ templateベース ~
template < class It >
void sort( It begin, It end );
template< class It, class Cmp >
void sort(It begin, It end, Cmp cmp);
※It:Iterator
※Cmp:Compare
• ○:静的に型情報解決
– コンパイル成功 ≒ ちゃんと動く
6. C++のインターフェース(2/2)
~ templateベース ~
template < class It >
void mysort(It begin, It end)
{ mysort(begin, end, myless<typename It::value_type>()); }
template< class It, class Cmp >
void mysort(It begin, It end, Cmp cmp) {
It n_1 = end; n_1--; // 最後を指す
for(It i=begin; i != n_1; ++i) for(It j=n_1; j != i; --j) {
It j_1 = j; j_1--;
if (cmp(*j, *j_1)) swap(*j, *j_1);
}}
mysort(vec.begin(), vec.end());
mysort(vec.begin(), vec.end(), mygreater<int>());
7. C++ & boostのインターフェース(1/2)
~ range-based algorithms ~
template< class Range >
Range &sort(Range &range);
template< class Range, class Cmp >
Range &sort(Range &range, Cmp cmp);
• Boost.Rangeが代表
– STLの薄いラッパー
• ○:引数がよりシンプルに
• ○:可変長配列(vector等)と固定長配列の違いを
意識する必要がほとんど無い
– 中で違いを吸収している
8. C++ & boostのインターフェース(2/2)
~ range-based algorithms ~
template< class Range >
Range &mysort(Range &range) {
std::sort(std::begin(range), std::end(range));
return range;
}
template< class Range, class Cmp >
Range &mysort(Range &range, Cmp cmp) {
std::sort(std::begin(range, std::end(range), cmp);
return range;
}
mysort(vec)
mysort(vec, mygreater<int>());
9. C++11のインターフェース(1/2)
~ rvalue reference & move semantics ~
template< class Range >
Range sort(Range range);
template< class Range, class Cmp >
Range sort(Range range, Cmp cmp);
• ○:データの流れが使う側で分かる
• ×:C++11未対応のコンパイラにソースを移植すると
コピーコンストラクタだらけになってしまう
※rvalue referenceとmove semanticsについては後述
10. C++11のインターフェース(2/2)
~ rvalue reference & move semantics ~
template< class Range >
Range mysort(Range range) {
std::sort(std::begin(range), std::end(range));
return range;
}
template< class Range, class Cmp >
Range mysort(Range range, Cmp cmp) {
std::sort(std::begin(range), std::end(range), cmp);
return range;
}
vec = mysort(std::move(vec));
vec = mysort(std::move(vec), mygreater<int>());