STL 컨테이너에서 페이지별로 데이터를 가져오고 싶은 경우가 있다.
이때 다음과 같이 template 클래스를 만들어서 사용하면 편리하다.
#include < iostream >
#include < vector >
#include < algorithm >

template< typename T >
class RangeIterator
{
public:
    typedef typename T::const_iterator TConstIterator;
    typedef std::pair< TConstIterator, TConstIterator > ConstIterPair;

    static ConstIterPair GetIterPairPerPage(const T& container, const size_t pageByZerobase, const size_t pagePerCount )
    {
        const size_t startIndex = pageByZerobase * pagePerCount;

        TConstIterator it_begin = (startIndex >= container.size())
            ? container.end()
            : std::next(container.begin(), startIndex);

        TConstIterator it_end = (pagePerCount >= static_cast< size_t >(std::distance(it_begin, container.end())))
            ? container.end()
            : std::next(it_begin, pagePerCount);

        return ConstIterPair::pair(it_begin, it_end);
    }

    static const size_t GetMaxPageByZeroBase(const T& container, const size_t pagePerCount)
    {
        return (pagePerCount < 1 || container.empty() ) ? 0 : (container.size() - 1) / pagePerCount;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    typedef std::vector< int > VecInts;

    VecInts vecInts;
    vecInts.push_back(0);
    vecInts.push_back(1);
    vecInts.push_back(2);
    vecInts.push_back(3);
    vecInts.push_back(4);
    vecInts.push_back(5);
    vecInts.push_back(6);
    vecInts.push_back(7);
    vecInts.push_back(8);
    vecInts.push_back(9);

    const size_t pagePerCount = 5;
    const size_t MAX_PAGE_BY_ZEROBASE = RangeIterator< VecInts >::GetMaxPageByZeroBase(vecInts, pagePerCount);

    auto iter_pair = RangeIterator< VecInts >::GetIterPairPerPage(vecInts, MAX_PAGE_BY_ZEROBASE, pagePerCount);

    std::for_each(std::begin(iter_pair), std::end(iter_pair),
        [](const VecInts::value_type& elem)
    {
        std::cout << elem << std::endl;
    });

    return 0;
}
2013/09/08 16:22 2013/09/08 16:22

덧글을 달아 주세요