programming/c++

[C++] STL-벡터

chanchand 2023. 1. 9. 14:11
반응형

컨테이너-벡터(std::vector)

vector는 가변길이 배열이며, 원소에 빠르게 접근할 수 있다.

O(1)로 수행할 수 있으며, [], at 함수를 이용하면 된다.

 

벡터의 크기를 리턴하는 함수 size의 리턴 타입은 size_type으로 정의되어 있다.

#include <iostream>
#include <vector>

int main(){
    std::vector<int> vec;
    vec.push_back(10);
    vec.push_back(20);
    vec.push_back(30);
    vec.push_back(40);

    for (std::vector<int>::size_type i=0; i<vec.size(); i++){
        std::cout << "vec의 " << i+1 << " 번째 원소 : " << vec[i] << std::endl;
    }
}

 

 

반복자

컨테이너 원소에 접근할 수 있는 포인터와 같은 객체이다.

벡터의 경우 []를 이용해서 배열처럼 위치에 접근할 수도 있다.

 

반복자는 컨테이너에 iterator 멤버 타입으로 정의되어 있으며, 

vector의 경우 begin() 함수와 end() 함수를 사용할 수 있다.

begin() 함수는 벡터의 첫번째 원소를, end() 함수는 마지막 원소 한칸뒤를 가리키는 반복자를 리턴한다.

for (std::vector<int>::iterator itr=vec.begin(); itr!=vec.end(); itr++){
    std::cout << *itr << std::endl;
}

std::vector<int>::iterator itr=vec.begin()+2;
std::cout << "3번째 원소 : " << *itr << std::endl;

 

insert, erase 함수를 사용할 수 있다.

#include <iostream>
#include <vector>

template <typename T>
void print_vector(std::vector<T>& vec){
    for (typename std::vector<T>::iterator itr=vec.begin(); itr!=vec.end(); itr++){
        std::cout << *itr << std::endl;
    }
}

int main(){
    std::vector<int> vec;
    vec.push_back(10);
    vec.push_back(20);
    vec.push_back(30);
    vec.push_back(40);

    std::cout << "처음 벡터 상태" << std::endl;
    print_vector(vec);
    std::cout << "-------------------------" << std::endl;

    vec.insert(vec.begin()+2, 15);
    print_vector(vec);
    std::cout << "-------------------------" << std::endl;

    vec.erase(vec.begin()+3);
    print_vector(vec);
}

 

vector에서 지원하는 반복자로 const 포인터 const_iterator가 있다.

cbegin()과 cend() 함수를 이용할 수 있으며, 반복자의 값을 바꾸지 않고 참조만 한다.

std::vector<int>::const_iterator citr=vec.cbegin();
*citr=30; //상수 반복자가 가리키는 값은 바꿀 수 없다.

 

vector에서 지원하는 반복자 중 마지막 종류로 벡터 뒤에서 앞으로 거꾸로 가는 역반복자가 있다.

end() 처럼 rend() 역시 맨 앞 원소의 바로 앞을 가리키게 된다.

std::vector<int>::reverse_iterator r_iter=vec.rbegin();
for (;r_iter!=vec.rend(); r_iter++){
    std::cout << *r_iter << std::endl;
}

 

- 범위 기반 for문 (range based for loop)

elem에 vec의 원소들이 매 루프마다 복사되어 들어가게 된다.

elem=vec[i]와 같은 형태로 동작한다.

#include <iostream>
#include <vector>

int main(){
    std::vector<int> vec;
    vec.push_back(10);
    vec.push_back(20);
    vec.push_back(30);

    for (int elem:vec){
        std::cout << "원소 : " << elem << std::endl;
    }

    return 0;
}
반응형

'programming > c++' 카테고리의 다른 글

[C++] STL  (0) 2023.01.09
[programmers] 폰켓몬  (0) 2023.01.09
[programmers] 완주하지 못한 선수  (0) 2023.01.08
[C++] 객체지향  (0) 2023.01.08
[C++] 힙(heap)  (0) 2023.01.08