티스토리 뷰
벡터 클래스는 모든 원소들이 동일한 타입을 갖는 배열과 유사하지만 그 크기를 동적으로 관리할 수 있다는 점에서 차이가 있다. 배열처럼 인덱스를 통해 각 원소에 접근할 수 있다. 배열보다 공간을 더 차지하고 추가적인 처리 비용이 더 필요하다는 특성이 있다. 향후 확장을 위해서 미리 여분의 공간을 확보하고, 확보한 공간을 넘어서서 확장하는 경우 공간 재할당을 수행하기 때문이다.
std::vector<std::string> split_path(const std::string &path, char delim)
{
std::vector<std::string> split;
std::string::size_type previous_index = 0;
auto separator_index = path.find(delim);
while (separator_index != std::string::npos)
{
auto part = path.substr(previous_index, separator_index - previous_index);
split.push_back(part);
previous_index = separator_index + 1;
separator_index = path.find(delim, previous_index);
}
if (previous_index < path.size())
{
split.push_back(path.substr(previous_index));
}
return split;
}
위의 예제에서는 벡터의 생성과 추가(push_back) 과정을 살펴볼 수 있다.
◆ 각 원소에 대한 접근
- at(size_t idx), [idx] : 지정 인덱스 위치의 원소
- front() : 첫 원소
- back() : 마지막 원소
- data() : 벡터 메모리에 대한 포인터 전달. 벡터 영역을 C 배열처럼 참조할 때 사용 가능
◆ 반복자 사용 가능
std::for_each(split.begin(), split .end(), [](const split str) { std::cout << str << ' '; });
위의 예제처럼 각 원소를 반복자를(begin(), end(), rbegin(), rend(), next(idx), prev(idx)) 통해서 일괄적으로 참조할 수 있다.
◆ 주요 메소드
- bool empty() : 원소가 없으면 true
- size_t size() : 원소 개수 리턴
- size_t max_size() : 시스템 환경을 감안한 최대로 가능한 원소 개수 리턴
- size_t capacity() : 현재 할당된 메모리로 저장 가능한 원소 개수 리턴
- void shrink_to_fit() : 현재 원소들에 맞게 사용하지 않는 공간을 제거
- void clear() : 모든 원소 제거
- insert() : 벡터에 자료 삽입(다른 벡터 포함)
std::vector<int> nums {1, 10 };
nums.insert(nums.begin(), 200); // 시작 위치에 200 삽입 { 200, 1, 10 }
nums.insert(nums.begin(), 2, 50); // 시작 위치에 50 2개 삽입 { 50, 50, 200, 1, 10 }
std::vector<int> n2{ 33, 20 };
nums.insert(std::next(nums.begin() , 3), n2.begin(), n2.end());
// 시작+3 위치에 n2의 시작부터 끝 원소를 삽입 { 50, 50, 200, 33, 20, 1, 10 }
- emplace(위치, 클래스 생성자 아규먼트), emplace_back( 클래스 생성자 아규먼트) : 클래스 벡터인 경우 클래스 인스턴스를 생성하고 해당 인스턴스를 벡터에 추가(insert, push_back...)하는 과정을 한 번에 할 수 있도록 해준다. emplace_back()는 벡터 끝에 생성.
- push_back(값) : 벡터 끝에 값 추가
- erase(위치) : 지정한 위치의 원소를 삭제. 삭제 위치는 반복자 표현으로 특정 위치와 범위로 모두 지정할 수 있다.
- pop_back() : 벡터 끝 원소 삭제
- A.swap(B) : A 벡터와 B벡터의 내용을 교체
◆ 특정 원소 찾기
#include <algorithm> 필요
if(find(nums.begin(), nums.end(), 55) == nums.end()) cout << "not exist\n";
위의 예제처럼 find(검색 시작 위치, 검색 끝 위치, 검색 값)를 수행하여 end() 반복자를 리턴하면 해당 값이 벡터에 없다는 이야기이고, 해당 값을 찾은 경우 at(), front(), back()의 리턴처럼 해당 원소에 대한 접근을 사용할 수 있다.
'C | C++' 카테고리의 다른 글
스트링 클래스(string, std::basic_string) 정리 (0) | 2024.01.24 |
---|---|
사전 클래스(std::map) 정리 (0) | 2024.01.22 |
프로세스 생성과 관리 (0) | 2018.08.04 |
프로그램 실행 (0) | 2018.08.04 |
프로그램 종료 (0) | 2018.08.04 |