IT 프로그래밍/자료구조

vector에서 원소의 삽입과 삭제

기술1 2024. 9. 20. 23:38
반응형

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); 를 해주는 것입니다.

 

 

 

반응형