STL 컨테이너에서 페이지별로 데이터를 가져오고 싶은 경우가 있다.
이때 다음과 같이 template 클래스를 만들어서 사용하면 편리하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#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

글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

덧글을 달아 주세요