vector 원소 삽입 삭제
vector의 맨 뒤에 원소를 삽입할 때는 push_back을 사용합니다. 맨 마지막 원소를 삭제할 때는 pop_back을 사용합니다. 그럼 맨 앞이나 혹은 가운데 삽입할 때는 어떻게 해야 할까요?
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
vector<string> sentence{"how", "is", "programming"};
//First try
sentence[1] = "fun";
for (auto word : sentence)
cout << word << " ";
cout << endl;
//Second try
sentence[1] = "is";
sentence[3] = sentence[2];
sentence[2] = sentence[1];
sentence[1] = "fun"; // size는 3이므로 sentence[3]은 적법한 인덱스 범위 넘어간다.
for (auto word : sentence) // 벡터 sentence의 size는 여전히 3이므로 how fun is 만 출력된다.
cout << word << " ";
cout << endl;
//Third try
vector<string> sentence2{ "how", "is", "programming" };
sentence.at(3) = sentence2.at(2); //인덱스 연산자 [] 대신 at을 쓰면 index out of range 오류 발생
sentence.at(2) = sentence2.at(1);
sentence.at(1) = "fun";
for (auto word : sentence2)
cout << word << " ";
cout << endl;
//Fourth try
vector<string> sentence3{ "how", "is", "programming" };
sentence3.resize(4); //벡터의 크기를 4로 만들어준다.
for (int i = sentence3.size() - 2; i >= 1; i--)
sentence3.at(i + 1) = sentence.at(i);
sentence3.at(1) = "fun";
for (auto word : sentence3)
cout << word << " ";
cout << endl; // 이 방법은 가능하긴 하지만 벡터에서 굳이 싶은 방법이다.
return 0;
}
위 예시들은 적절하지 않은 원소의 삽입과 삭제의 방법을 보여준 코드입니다.
iterator란?
벡터에 대해서 좀 더 다양한 작업을 할 수 있게 지원 및 stl 컨테이너 에서도 동일한 인터페이스를 제공하는 것입니다. 벡터 내에 특정 위치를 가리키는 포인터라고 생각하면 편합니다.
iterator의 선언
vector::begin()은 벡터의 첫 번째 원소를 가리키는 iterator를 생성해줍니다.
vector::end()는 마지막 원소의 다음 위치를 가리키는 iterator를 생성해줍니다.
vector<int>::iterator it1 = v.begin();
#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 (int x : v)
cout << x << " ";
cout << endl;
return 0;
}
이렇게 하게 되면 인덱스에서 1에 해당되는 공간에 2가 아닌 4로 수정이 되게 됩니다. 즉 이렇게 vector에 있는 하나의 값을 수정해주고 싶을 때는 포인터의 기능을 하는 iterator를 이용해서 바꿔주는 식으로 해주면 되는 것입니다.
iterator를 포인터처럼 사용할 수 있다는 이야기입니다.
//원소 삽입
v.insert(it, 100);
for (int x : v)
cout << x << " ";
cout << endl;
cout << *it << endl;
it = v.begin();
it += 2; // 두 칸 전진
it = v.insert(it, 200);
for (auto x : v)
cout << x << " ";
cout << endl;
cout << *it << endl;
erase
it = v.erase(it);
for (auto x : v)
cout << x << " ";
cout << endl;
cout << *it << endl;
이렇게 iterator를 사용해서 삭제를 해줄 수 있습니다. 이번에는 begin으로 간 후 it +=3 을 해주어서 index가 3인 값을 erase해줍니다. 그러면 이 iterator 자체는 무효화 됩니다. iterator를 계속해서 사용하려면 역시 erase의 return 값을 받아야 하므로 it = v.erase(it); 를 해주는 것입니다.
'IT 프로그래밍 > 자료구조' 카테고리의 다른 글
[자료구조] 연결리스트 (0) | 2024.09.26 |
---|---|
[자료구조] c++ 주소록 프로그램 (1) | 2024.09.21 |
[C언어] 주소록 프로그램 strtok에 대한 설명 (0) | 2024.09.06 |
[C++] string 클래스와 getline 사용법 (0) | 2024.09.06 |
[C언어] 문자열 string, fgets 설명 (0) | 2024.09.06 |