C++/C++ STL

vector

재윤 2024. 2. 9. 19:09
반응형

vector 기본 사용법

std::vector는 가변 크기의 배열을 나타내는 C++ 표준 라이브러리 컨테이너이다. 이는 배열과 유사하지만 크기를 동적으로 조정할 수 있는 장점을 가지고 있습니다.

아래는 std::vector를 사용하는 기본적인 방법이다.

  • 헤더 파일
#include <vector>
  • 벡터 선언
std::vector<int> myVector; // int 형 벡터 선언
  • 원소 추가
myVector.push_back(5); // 벡터 끝에 원소 추가
  • 원소 접근

[] 연산자를 사용하여 인덱스를 통해 원소에 접근.

at() 함수를 사용하여 범위 검사를 수행하면서 원소에 접근.

int element = myVector[0]; // 첫 번째 원소에 접근
int element2 = myVector.at(1); // 두 번째 원소에 접근 (범위 검사 수행)
  • 벡터 크기 알기
size_t size = myVector.size(); // 벡터의 현재 크기 반환
  • 원소 삭제
myVector.pop_back(); // 벡터의 마지막 원소 삭제
  • 벡터 순회
for (size_t i = 0; i < myVector.size(); ++i) {
    std::cout << myVector[i] << " ";
}

범위 기반 for루프도 사용 가능.

for (const auto& element : myVector) {
    std::cout << element << " ";
}
  • 벡터 초기화

→ 초기 값으로 벡터를 채우거나 다른 컨테이너에서 데이터를 복사하여 벡터를 초기화할 수 있다.

std::vector<int> myVector1(5, 10); // 5개의 원소를 10으로 초기화한 벡터 생성
std::vector<int> myVector2(myVector1.begin(), myVector1.end()); // 다른 벡터에서 범위로 벡터 초기화
  • 벡터 비우기
myVector.clear(); // 벡터의 모든 원소 제거
  • 벡터 복사

→ 벡터를 복사하려면 복사 생성자를 사용하거나 대입 연산자를 사용.

std::vector<int> newVector = myVector; // 복사 생성자 사용
std::vector<int> anotherVector;
anotherVector = myVector; // 대입 연산자 사용

 

간단 사용법은 알았고 이제 예제를 통해 알아보자.

  • 정수형 std::vector를 생성하고, push_back 함수를 사용하여 원소를 추가함.
  • 그런 다음 size() 함수를 사용하여 벡터의 크기를 출력하고, 벡터의 각 원소를 순회하면서 출력.
  • 마지막으로 각 원소에 5를 더하여 출력.
#include <iostream>
#include <vector>

int main() {
    // 정수형 벡터 생성
    std::vector<int> numbers;

    // 벡터에 값 추가
    numbers.push_back(10);
    numbers.push_back(20);
    numbers.push_back(30);

    // 벡터의 크기 출력
    std::cout << "Vector size: " << numbers.size() << std::endl;

    // 벡터의 각 원소 출력
    std::cout << "Vector elements:";
    for (size_t i = 0; i < numbers.size(); ++i) {
        std::cout << " " << numbers[i];
    }
    std::cout << std::endl;

    // 벡터의 각 원소에 5를 더하여 출력
    std::cout << "Vector elements after adding 5:";
    for (size_t i = 0; i < numbers.size(); ++i) {
        std::cout << " " << numbers[i] + 5;
    }
    std::cout << std::endl;

    return 0;
}

 

결과

Vector size: 3
Vector elements: 10 20 30
Vector elements after adding 5: 15 25 35

 

vector 반복자

C++의 std::vector는 반복자(iterator)를 사용하여 컨테이너의 원소에 접근하고 조작할 수 있다.

  • 반복자는 일반적으로 포인터와 유사한 개념임.
  • 범위 기반 for 루프나 알고리즘과 함께 사용하여 컨테이너의 원소를 순회하거나 조작하는 데 유용하다.

반복자에는 2가지 방법이 있다.

  1. auto를 사용하는 방법
  2. 명시적인 반복자 타입 방법

→ auto는 C++11임 명시적인 반복자 타입의 귀찮음을 없애줌.

  1. begin():
    • 벡터의 첫 번째 원소를 가리키는 반복자를 반환.
    • **begin()**을 사용하여 첫 번째 원소에 접근할 수 있다.
  2. end():
    • 벡터의 끝을 가리키는 반복자를 반환.
    • 실제 데이터가 끝나는 다음 위치를 가리키므로, 마지막 원소 다음 위치를 가리킨다.
    • **end()**를 사용하여 마지막 원소 다음 위치에 접근하면 안됨.

반복자를 좀 더 설명하면 반복자의 변수 이름인 iter이 있다고 가정하면

  • 값에 접근하기 위해서는 *iter를 해주어야함
  • 왜? → iter는 그 컨테이너의 주소값을 가리키고 있기 때문. 그래서 그 주소값 안 데이터에 접근하기 위해 *****를 사용해야함. C의 포인터랑 똑같음.

 

예시를 통해 알아보자.

#include <iostream>
#include <vector>

int main() {
    // 정수형 벡터 생성
    std::vector<int> numbers;

    numbers.push_back(1);
    numbers.push_back(2);
    numbers.push_back(3);
    numbers.push_back(4);
    numbers.push_back(5);

    // begin()과 end()를 사용하여 벡터의 모든 원소 출력
    // 1. C++11에 있는 auto 
    std::cout << "Vector elements:";
    for (auto it = numbers.begin(); it != numbers.end(); ++it) {
        std::cout << " " << *it;
    }
    std::cout << std::endl;

    //2. 명시적인 반복자 타입 iterator
    std::vector<int>::iterator iter;
    std::cout << "Vector elements:";
    for (iter = numbers.begin(); iter != numbers.end(); ++iter) {
        std::cout << " " << *iter;
    }
    std::cout << std::endl;

    return 0;
}

결과

Vector elements: 1 2 3 4 5
Vector elements: 1 2 3 4 5

위에서는 반복자를 순회의 목적으로 사용했는데 find 함수를 사용해서 값을 찾고 그 값의 주소값을 반복자에게 넣어줄 수 있다.

 

find 값 찾고 반복자

예제를 통해 바로 알아보자.

#include <iostream>
#include <vector>

int main() {
    // 정수형 벡터 생성
    std::vector<int> numbers;

    numbers.push_back(1);
    numbers.push_back(2);
    numbers.push_back(3);
    numbers.push_back(4);
    numbers.push_back(5);

    //3. find 함수
    std::vector<int>::iterator vector_iter;
    vector_iter = std::find(numbers.begin(), numbers.end(), 2);
    std::cout << "vector_iter : " << *vector_iter << std::endl;

    return 0;
}

결과

vector_iter : 2

 

vector 메모리

  • vector는 array와 달리 동적 배열이라고도 불린다.
  • 동적이란 말은 프로그램이 실행될 때 무엇인가가 변화한다는 말임.
  • 배열에서 변할 수 있는 것은 배열의 원소 개수임. vector는 실행 시 원소의 개수가 변할 수 있다.
  • vector는 반드시 물리적으로 연속된 메모리를 사용하여 원소를 저장함.
  • vector에 원소가 가득 차면, 메모리는 new로 요청해서 새로 확보를 한다.

vector 메모리 할당 순서

  1. 현재 담을 수 있는 원소의 개수 보다 더 큰 메모리를 요청함.
  2. 새 메모리에에 현재 원소를 모두 복사.
  3. 복사한 원소들의 다음 위치에 새 원소를 추가함.
  4. 이전 메모리를 반환.

메모리를 새로 할당 받고 거기로 옮겨가는 것인데 상황에 따라 얼마나 비용이 큰 동작인지 알아야함.

 

다시 정리하는 C++ STL 자료구조 vector

 

다시 정리하는 C++ STL 자료구조 vector

[ STL 자료구조 vector] STL vector는 array와 달리 동적 배열이다. 동적이란 무슨 뜻일까? 프로그램이 실행될 때 무엇인가가 변화한다는 의미이다. 배열에서 변할 수 있는 것은 배열의 원소 개수이다. ve

ssinyoung.tistory.com

[C++] vector 원소 찾기, 해당 인덱스 찾기 (find 함수)

 

[C++] vector 원소 찾기, 해당 인덱스 찾기 (find 함수)

1. vector내에 해당 원소가 존재하는지 확인 find(v.begin(), v.end(), 찾을 대상) 리턴 값이 v.end()인 경우 => 해당 원소가 존재하지 않는 것 리턴 값이 v.end()가 아닌 경우 => 해당 원소 존재하는 것 2. vector

9x211x2.tistory.com

[C++문법] list, iterator로 list에 있는 원소 출력하기

 

[C++문법] list, iterator로 list에 있는 원소 출력하기

자바스크립트를 쓰다보면 배열 및 리스트 관리하기가 굉장히 편하다. 가령, 리스트 안에 있는 모든 원소를 꺼내려면 for(var key in list) 와 같이 간단하게 리스트 안의 원소들을 출력 할 수 있지만 C

danco.tistory.com

[C++] 반복자 (Iterator)

 

[C++] 반복자 (Iterator)

C++ 반복자(Iterator) C++ 라이브러리는 반복자를 제공하는데 이것을 사용하면 라이브러리의 방식대로 자료구조를 액세스 할 수 있다. 따라서 라이브러리가 효과적으로 동작한다는 것을 보장 할 수

eehoeskrap.tistory.com

 

반응형

'C++ > C++ STL' 카테고리의 다른 글

stack  (0) 2024.02.09
list  (0) 2024.02.09
STL, 컨테이너, 반복자 개념  (0) 2024.02.09