Iterator

๋ฐ˜๋ณต์ž๋Š” 33. Generic ํ•จ์ˆ˜์ด๋‹ค.

์ฆ‰, ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์ „์—ญํ•จ์ˆ˜์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฐฐ์—ด์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด vector, array, list์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ์ด๋…€์„๋“ค์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด ์„ธ๊ฐ€์ง€ ๊ฐ์ฒด์— ์–ด๋–ค method๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค.

๋˜ํ•œ,ย ์–ด๋–ค ์ธํ’‹์ด ๋“ค์–ด์˜ค๋“ ๊ฐ„์—, ํด๋ž˜์Šค๋‚˜ ํ•จ์ˆ˜๋ฅผ ๋Œ์•„๊ฐ€๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŠน์ • ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ๋ณด๋‹ค ํŽธ๋ฆฌํ•˜๋‹ค.

๊ทธ๋ž˜์„œ Iterator ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ช‡๊ฐœ์˜ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด๋†“์•˜๋‹ค.

Method

Iterator ๊ฐ์ฒด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด 7๊ฐœ์ด๋‹ค.

  1. *iter
  2. iter++
  3. iter--
  4. iter1 == iter2
  5. iter1 != iter2
  6. begin(๊ฐ์ฒด)
  7. end(๊ฐ์ฒด)

์ด๊ฒƒ๋“ค์€ ์‹ค์ œ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š”ย ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹ˆ๋‹ค!

ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•ด ๋†“์€ ๋…€์„๋“ค์ด๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ iter1 + iter2 ์™€ ๊ฐ™์€ ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

beginย ,ย endย ๋Š” ๊ฐ์ฒด๋ฅผ ์ง‘์–ด๋„ฃ๊ฒŒ๋  ๊ฒฝ์šฐ, ์ฒ˜์Œ ์ฃผ์†Œ์™€ ๋ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๋Š” iterator ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ํฌ์ธํ„ฐ์™€ ๋น„์Šทํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Example

iterator๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ,

#include <iostream>
#include <vector>
 
using namespace std;
 
int main(){
    int ary[] = {1,2,3,4};
    int *pBegin, *pEnd;
    pBegin = ary;
    pEnd = ary + 4;
    
    for (int* pIter = pBegin; pIter != pEnd; pIter++){
        cout << *pIter << endl;
    }
    cout << endl;
    
    return 0;
}

iterator๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ

#include <iostream>
#include <vector>
 
using namespace std;
 
int main(){
    
    vector<int> v{10, 20, 30, 40};
    for(auto iter = begin(v); iter != end(v); iter++){
        cout << *iter << '\t';
    }
    cout << endl;
 
    return 0;
}

์—ฌ๊ธฐ์„œ auto๋ฅผ ์„ ์–ธํ•ด์ค€๊ฒŒ ์ค‘์š”ํ•œ๋ฐ, begin ํ•จ์ˆ˜์— ์ธํ’‹์— ๋”ฐ๋ผ ๋ฐ˜ํ™˜ํ•˜๋Š” iterator์˜ ๊ฐ์ฒด ์ž๋ฃŒํ˜•์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์ด ์ž๋ฃŒํ˜•์„ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” auto๋ฅผ ์„ ์–ธํ•ด์ค€๋‹ค.

์•„๋งˆ iterator ํด๋ž˜์Šค๋Š” template ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์ ธ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ iter ์ธ์Šคํ„ด์Šค๊ฐ€ end(v) ์ด๊ธฐ ์ „๊นŒ์ง€ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ,

ํ•ด๋‹น ์ฃผ์†Œ์˜ ์š”์†Œ๋ฅผ ์ถœ๋ ฅํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Example2

#include <iostream>
#include <vector>
#include <list>
 
using namespace std;
 
template<class T>
void print(const T& iter_begin,const T& iter_end){
    for(auto iter = iter_begin; iter != iter_end; iter++)
        cout << *iter << '\t';
    cout << endl;
}
 
 
template<class T>
void print_reverse1(const T& iter_begin, const T& iter_end){
    auto iter = iter_end;
    while(iter != iter_begin){
        iter--;
        cout << *iter << '\t';
    }
    cout << endl;
}
 
 
int main(){
    vector<int> v1{1, 2,3,4};
    list<double> l1{10.1, 10.2, 10.3};
    int ary[] = {100, 200, 300, 400};
    
    print(begin(v1), end(v1));
    print(begin(l1), end(l1));
    print(begin(ary), end(ary));
    cout << endl;
    
    print_reverse1(begin(v1), end(v1));
    print_reverse1(begin(l1), end(l1));
    print_reverse1(begin(ary), end(ary));
    cout << endl;
    
    return 0;
}

๊ฑฐ๊พธ๋กœ ์ถœ๋ ฅํ•  ๋•Œ, iter_end๋ฅผ ํ•˜๋‚˜ ์ค„์—ฌ์ค€ ์ด์œ ๋Š”, end()ย ํ•จ์ˆ˜๊ฐ€ ํ•ด๋‹น๊ฐ์ฒด์˜ ๋‹ค์Œ ์ฃผ์†Œ๋ฅผ ๋ฆฌํ„ดํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์ด ๊ฐ’๋ถ€ํ„ฐ ์ถœ๋ ฅ์„ ์‹œ๋„ํ•˜๊ฒŒ ๋˜๋ฉด, ์“ฐ๋ ˆ๊ธฐ๊ฐ’์ด ์ถœ๋ ฅ๋˜๊ณ  ๊ฐ์ฒด์˜ ์ฒ˜์Œ ์š”์†Œ๋Š” ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

for๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ reverse๋กœ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ์˜ˆ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

template<class T>
void print_reverse2(T iter_begin,T iter_end){
    iter_end--;
    iter_begin--;
    for(auto iter = iter_end; iter != iter_begin; iter--){
        cout << *iter << '\t';
    }
    cout <<  endl;
}

์ด๋ ‡๊ฒŒ ๋  ๊ฒฝ์šฐ ๋ ˆํผ๋Ÿฐ์Šค๋กœ ์ธ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ฌ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. ํ•จ์ˆ˜ ์•ˆ์—์„œ iterator ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ์ค„์ธ ํ›„์— for๋ฌธ์„ ๋Œ๋ ค์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์šฐ๋ฆฌ๋Š” deep copy๋ฅผ ํ•œ ์ดํ›„ ์ด ํ•จ์ˆ˜๋ฅผ ๋Œ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ํ•œ๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค.