STL Container - Vector

headkio·2020년 9월 10일
0

C++

목록 보기
12/35
post-thumbnail

Vector ?

  • 어떤 자료도 넣을 수 있는 동적 배열 (동적 = 메모리 자동 관리)
  • 저장된 모든 요소가 연속된 메모리 공간에 위치

-> 메모리 자동 관리 배열이다.

Vector 사용

#include <vector>

int main() 
{
  // 선언
  std::vector<int> vector1;
  std::vector<string> vector2;
  std::vector<Cat> vector3;
  std::vector<Cat *> vector5;
  
  // 복사 
  std::vector<int> scores;
  scores.push_back(1);
  std::vector<int> scoresClone(scores); // 복사 생성자
  
  // 생성시 크기 지정 (잘안씀)
  std::vector<int> scroes(10);
  // 10개를 넣을 수 있는 메모리를 미리 할당 후 초기화까지 함. 
  
  // 함수
  vector[3];
    // 요소 하나 접근 
    // 값이 바뀐다는 것은, 연산자가 참조를 반환하는 것을 알 수 있다.
  vector.push_back(123); // 데이터 뒤에 삽입
  vector.pop_back(); // 맨뒤 제거
  vector.capacity(); // 할당된 메모리 (최대 담을 수 있는 요소의 수)
  vector.size(); // 지금 담겨 있는 요소 수
  vector.reserve(10); 
    // vector의 용량을 미리 정한다. 
    // 불필요한 재할등을 막기위해, 예상이 되는 곳은 미리 공간을 잡아두는 것이 좋다.
  vector.resize(10); 
    // 크기를 바꾸고 초기화까지 해준다. int일 경우 0으로 채워준다.
    // 용량이 더 크다면, 강제로 줄인다. 무조건 주어진 크기로 바꾼다.
  iterator = vector.insert(iterator, 30); 
    // iterator 위치에 값을 넣고 나머지는 한칸씩 뒤로 미룬다. 
    // 삽입된 위치 iterator를 반환한다.
    // 복사 문제 : 한칸씩 미루느라 성능 느림 수 있음.
    // 매모리 재할당 : reserve를 미리 안하면, 연속된 공간을 찾느라 전체 메모리를 다시 찾을 수 있다.
  vector.erase(iterator); 
    // iterator 위치의 요소를 삭제한다.
    // 지우고 빈공간만큼 뒤 요소를 하나씩 땡겨야 한다.
  vector.assign(7, 100); // 7개를 100으로 채운다. 위치는 어디서부터 ??
  vector.swap(vector2); 
    // 2개 Vector 교환
    // 메모리 할당 없어 빠르다.
  vector.clear(); // 모든 요소 제거, 크기(size)는 0, 용량(capacity)는 변하진 않음.
  
  // 반복 1
  // 이 반복은 배열처럼 사용가능한 vector만 가능. 다른 STL Container는 Iterator 사용.
  for (size_t i =0; i < scores.size(); ++i) 
  {
    std::cout << scores[i] << " ";
  }
  
  // 반복 2
  for (std::vector<int>::iterator iter = scores.begin(); iter != scores.end(); ++iter)
  {
    std::cout << *iter << " ";
  }
    // scroes.begin() : 첫번째 요소를 가리킨다.
    // scroes.end() : 마지막 요소 '다음'을 가리킨다. 
 
  // 반복 3 (역순)
  for (std::vector<int>::reverse_iterator iter = scores.rbegin(); iter != scores.rend(); ++iter)
  {
    std::cout << *iter << " ";
  }
  
  // 포인터 백터
  std::vector<Score*> scores;
  scores.reserve(2);
  scores.push_back(new Score(10, "C");
    // 생성한 요소 개체들은 delete를 꼭 해주자.
}

장점

순서 상관없이 요소에 임의 접근 가능하다.
제일 마지막 요소 삽입/삭제가 빠르다.

단점

중간 요소 삽입/삭제 느리다.
재할당 및 요소 복사에 비용이 든다.

profile
돌아서서 잊지말고, 잘 적어 놓자

0개의 댓글