반응형
컨테이너-벡터(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 |