자료구조&알고리즘/C++
vector 벡터02 반복자(iterator)
geminanolja
2024. 12. 14. 17:01
vector에서 반복자(iterator)
1. 벡터 반복자 선언 및 초기화
기본 선언
#include <vector>
#include <iostream>
std::vector<int> vec = {1, 2, 3, 4, 5};
// 반복자 선언
std::vector<int>::iterator it; // 기본 반복자 선언
it = vec.begin(); // 벡터의 시작을 가리키도록 초기화
C++11 이후의 auto를 사용한 선언
C++11부터는 auto를 사용하여 반복자를 간단히 선언
auto it = vec.begin(); // vec의 시작 반복자를 자동으로 선언
2. 반복자의 주요 메서드
1) 순회
std::vector<int> vec = {10, 20, 30, 40, 50};
// 반복자를 사용한 순회
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " "; // 반복자가 가리키는 값 출력
}
2) auto와 함께 사용
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
3) 범위 기반 for 루프 (C++11 이상)
범위 기반 for문을 사용하면 더 간단하게 순회
for (int value : vec) {
std::cout << value << " ";
}
3. 반복자의 종류
반복자 유형 설명
iterator | 읽기/쓰기 가능한 기본 반복자. |
const_iterator | 읽기 전용 반복자. 데이터를 수정할 수 없습니다. |
reverse_iterator | 벡터를 역순으로 순회하는 반복자. |
const_reverse_iterator | 읽기 전용 역순 반복자. 데이터를 수정할 수 없습니다. |
1) const_iterator
읽기 전용 반복자. 요소를 변경하려고 하면 컴파일 에러가 발생
std::vector<int> vec = {1, 2, 3, 4, 5};
// 읽기 전용 반복자
for (std::vector<int>::const_iterator it = vec.cbegin(); it != vec.cend(); ++it) {
std::cout << *it << " "; // 요소를 읽을 수는 있지만 수정은 불가능
}
2) reverse_iterator
벡터를 역순으로 순회
std::vector<int> vec = {1, 2, 3, 4, 5};
// 역순 반복자
for (std::vector<int>::reverse_iterator it = vec.rbegin(); it != vec.rend(); ++it) {
std::cout << *it << " ";
}
3) const_reverse_iterator
읽기 전용 역순 반복자
std::vector<int> vec = {1, 2, 3, 4, 5};
// 읽기 전용 역순 반복자
for (std::vector<int>::const_reverse_iterator it = vec.crbegin(); it != vec.crend(); ++it) {
std::cout << *it << " ";
}
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> a = { 10,20,30,40,50 };
for (vector<int>::iterator it = a.begin(); it != a.end(); ++it)
{
cout << *it << endl;
}
cout << endl;
for (vector<int>::reverse_iterator rev = a.rbegin(); rev != a.rend(); ++rev)
{
cout << *rev << endl;
}
cout << endl;
for (auto it = a.begin(); it != a.end(); ++it)
{
cout << *it << endl;
}
cout << endl;
for (auto it : a)//범위 기반 for 루프
{
cout << it << endl;
}
return 0;
}
#include <iostream>
#include <vector>
#include <algorithm> // std::for_each
#include <iterator> // std::ostream_iterator
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
// 방법 1: 인덱스를 사용한 순회
for (int i = 0; i < vec.size(); i++) {
cout << vec[i] << " ";
}
cout << endl;
// 방법 2: Range-based for loop (C++11 이상)
for (int v : vec) {
cout << v << " ";
}
cout << endl;
// 방법 3: 반복자(iterator) 사용
for (auto it = vec.begin(); it != vec.end(); ++it) {
cout << *it << " ";
}
cout << endl;
// 방법 4: std::for_each와 람다 함수 사용
std::for_each(vec.begin(), vec.end(), [](int v) {
cout << v << " ";
});
cout << endl;
// 방법 5: std::copy와 std::ostream_iterator 사용
std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(cout, " "));
cout << endl;
return 0;
}
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
- 방법 1: 인덱스를 사용하여 순회합니다. vec.size()를 사용해 벡터의 크기를 얻어옴
- 방법 2: C++11 이상의 범위 기반 for 루프를 사용해 벡터의 각 요소를 출력
- 방법 3: 반복자(iterator)를 사용하여 벡터의 시작부터 끝까지 순회
- 방법 4: std::for_each와 람다 함수를 사용하여 벡터의 모든 요소를 출력
- 방법 5: std::copy와 std::ostream_iterator를 사용하여 벡터의 모든 요소를 출력
4. 반복자를 사용한 요소 수정
반복자를 사용하여 벡터의 요소를 수정
std::vector<int> vec = {1, 2, 3, 4, 5};
// 벡터 요소를 모두 0으로 수정
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
*it = 0; // 반복자가 가리키는 값을 수정
}
// 결과 출력
for (int value : vec) {
std::cout << value << " "; // 출력: 0 0 0 0 0
}
5. 반복자와 STL 알고리즘
반복자는 std::sort, std::find 등의 STL 알고리즘과 함께 사용
#include <algorithm>
std::vector<int> vec = {3, 1, 4, 1, 5};
// std::sort를 사용하여 정렬
std::sort(vec.begin(), vec.end()); // {1, 1, 3, 4, 5}
// std::find를 사용하여 값 찾기
auto it = std::find(vec.begin(), vec.end(), 3);
if (it != vec.end()) {
std::cout << "Found 3 at index " << it - vec.begin();
}
6. 반복자의 장점
- 벡터 요소를 순회하고 수정할 때 간편하게 사용할 수 있음.
- STL 알고리즘과 호환 가능.
- 다양한 종류의 반복자를 제공하여 유연한 작업이 가능.