vector의 맨 뒤에 원소를 삽입할 대는 push_back을 삽입합니다.
그러면 맨 앞이나 혹은 가운데에 삽입하려면 어떤 것을 사용해야 할까요? 그리고 원소를 삭제하려면 어떠한 원소를 사용해야 할까요?
배열이라면 배열 자체가 특별한 기능을 제공해주는 것은 없습니다. 그 위치부터 끝까지 저장되어 있는 데이터를 이동을 시키고 빈칸으로 만든 다음 새로운 데이터를 써주는 방법 있는데요.
배열에 데이터를 저장한다고 했을 때 빈칸없이 저장하는 것이 배열을 사용할 때 다른 부분에서 사용할 때 고려해서 코딩을 해야되기 때문에 예외적인 경우라고 볼 수 있고, 앞에서 꽉꽉 찬 상태를 유지해야한다면 다른 데이터를 옮겨오거나 한칸씩 땡기는 작업을 직접 다 해야하는 경우입니다.
vector는 이런 일들에 대해서 기능을 제공하기 때문에 배열보다 훨씬 편하게 사용할 수 있습니다. 그런 일을 하기 위해서는
iterator
바로 이 iterator를 사용하는 것입니다. 벡터의 위치에 무엇을 삽입하고 삭제하기 위해서는 이것을 사용하는 것이며 C언어에는 없는 것입니다.
iterator는 벡터에 대해서 좀 더 다양한 작업을 할 수 있으며 컨테이너에도 동일한 인터페이스를 제공하는 것입니다. 벡터 내의 특정 위치를 가리키는 포인터라고 생각해도 됩니다.
iterator 선언
vector::begin()은 벡터의 첫 번째 원소를 가리키는 iterator를 생성해 주며
vector::end()는 마지막 원소의 다음 위치를 가리키는 iterator를 생성해 줍니다.
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for (int i = 0; i < 4; i++)
v.push_back(i + 1);
vector<int>::iterator it;
it = v.begin();
//iterator의 증가
it++;
//iterator를 이용한 원소 읽기/쓰기
int n = *it;
cout << n << endl;
*it = n * 2;
for (auto x : v)
cout << x << " ";
cout << endl;
}
이런식으로 vector에 it를 넣어줄 수 있는데요.
처음에 it는 0의 vector 부터 시작하며 it++ 증가합니다. int n = *(it;가 되며 이 값은 2에 해당합니다. n을 출력한다면 2가 출력될 것입니다. v는 1 2 3 4라는 가정입니다. c언어를 배운 분이라면 *가 포인트와 같다는 것을 알 수 있는데요. 사용자 입장에서 포인터라고 사용하셔도 괜찮기는 하나 iterator는 포인터 보다 더 많은 일을 작업합니다.
Insert 메서드
메서드를 통해 배열에 추가를 해줄 수 있습니다. 배열과는 달리 vector에는 insert를 통해 쉽게 해줄 수 있는 것입니다.
v.insert(it, 100);
for (auto x : v)
cout << x << " ";
cout << endl;
cout << *it << endl;
insert는 이렇게 사용하시면 됩니다. insert(넣어줄 곳, 넣어줄 수) 이런 식으로 해주시면 되는데요. 그러면 정상적으로 위치하게 됩니다.
Erase 메서드
it = v.erase(it);
for (auto x : v)
cout << x << " ";
cout << endl;
cout << *it << endl;
삭제해주는 메서드입니다. v.erase를 해주시면 되는데요. 그럼 해당 it 자리에 있던 vector를 삭제해주는 것입니다. it는 삭제된 다음 원소를 가리키게 됩니다. 따라서 *it를 출력하면 erase 하기 전 바로 뒤에 있던 vector를 출력해줍니다.
'IT 프로그래밍 > C++' 카테고리의 다른 글
C++ [포인터 개념 정리] (0) | 2024.03.26 |
---|---|
벡터의 순회 (0) | 2024.03.25 |
[따배시 6.5] 정적 다차원 배열 (0) | 2024.03.25 |
[따배시 5.7 ~ 5.8] 반복문 for, break, continue (0) | 2024.03.23 |
[따배시 5.4] goto 반복문 while (0) | 2024.03.23 |