컨테이너의 요소에 대해 “추상적”인 접근을 가능하게 하는 기능
포인터와 유사하게 사용 가능
대부분 컨테이너는 반복자를 사용해 순환 가능
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <list>
int main()
{
std::vector<int> vec{ 1,2,3 };
std::set<int> myset{ 1,2,3 };
std::vector<int>::iterator it1;//반복자 선언
std::set<int>::iterator it2;//반복자 선언
return 0;
}
vector<int> vec{1,2,3};
그림과 같이 배열과 비슷하게 구성이 된다. 이때 자동적으로 begin과 end가 생성이 되어 첫 번째 요소와 마지막 요소의 뒤를 가리키게 된다.
set<char> ch{'A','B','C','D'};
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vec{ 1,2,3 };
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); it++)
{
std::cout << *it << std::endl;
}
return 0;
}
근데 사용하기에 너무 길다..! iterator 선언하려면 “std::vector::iterator”를 써야하다니..
그래서 cpp에서는 “auto”라는 키워드를 지원해 준다.
#include <iostream>
int Add(int a, int b)
{
return a + b;
}
int main(){
int a = 5;
auto b = 5;// b is int
auto c = b; // c is int
auto d = Add(2, 3); // d is int
}
💡
즉, 위와 같이 우변의 타입을 보고 컴파일러가 좌변의 타입을 추정해준다.
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vec{ 1,2,3 };
//std::vector<int>::iterator it = vec.begin();
auto it = vec.begin();
return 0;
}
위와 같이 긴 코드를 작성 할 필요없이 간단하게 작성이 가능하다.
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec{ 1,4,7 };
auto it = vec.begin();
it += 2;//연산 사용 가능
std::cout << *it << std::endl;//iterator를 포인터 개념으로 생각하자
}
#include <iostream>
#include <vector>
#include <set>
int main() {
std::vector<int> vec{ 1,4,7 };
std::set<char> mySet{ 'A','B','D' };
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); it++)
{
std::cout << *it << std::endl;
}
for (std::set<char>::iterator it2 = mySet.begin(); it2 != mySet.end(); it2++)
{
std::cout << *it2 << std::endl;
}
}
#include <iostream>
#include <vector>
#include <set>
int main() {
std::vector<int> vec{ 1,2,3 };
for (std::vector<int>::reverse_iterator it = vec.rbegin();it != vec.rend(); ++it)
{
std::cout << *it << " "; // 3, 2 , 1 출력
}
}