자료구조&알고리즘/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 알고리즘과 호환 가능.
  • 다양한 종류의 반복자를 제공하여 유연한 작업이 가능.