[C++]7. vector 사용하기(vector에서 중간 원소 삭제하기)
안녕하세요 고급 개발자가 꿈인 코린이 입니다.
오늘은 vector에 중간 원소를 삭제하는 방법에 대해서 설명 드리겠습니다.
vector에서 사용하는 함수는 push_back 및 pop_back들이 있습니다. 이것 들은 stack구조를 가지고 있습니다.
그래서 먼저들어온것이 나중에 삭제되는 구조를 가지고 있는데요. 이렇게 되면 vector로 지정하면
중간에 있는 원소들은 삭제가 불가능 한것인지 그리고 vector중간에 데이터를 넣을수는 없는지 의문이 생기게 됩니다.
중간에 데이터를 넣거나 삭제를 할수 없다면 프로그래밍에서 구지 필요없는 컨테이너겠죠??
그래서 오늘은 vector 중간에 데이터를 넣거나 삭제하는 내용을 포스팅 하겠습니다.
vector에서 중간에 데이터를 삭제하거나 추가를 하려면 반복자인 iterator를 사용해야합니다.
c++에 대해서 익숙하지 않는 분들께서는 iterator를 어렵게 생각하실수도있는데 (사실 필자도 어려웠습니다.)
막상 iterator를 사용하다보니 간단한 내용 이었습니다.
여태 프로그래밍을 많이 해보다 보면 알면은 쉽지만 모를때는 엄청 어려운것 같습니다.
이런 느낌은 나중에 고급프로그래머가 되어서도 계속 느끼는 느낌이라고 하니 참고하시고 프로그래밍을 하시면 됩니다.
아래의 코드를 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
#include "ServiceClass.h"
ServiceClass::ServiceClass()
{
vectorTest();
}
ServiceClass::~ServiceClass()
{
}
void ServiceClass::vectorTest()
{
std::vector<int> testVector;
int i = 0;
int count = 0;
testVector.push_back(1);//데이터들을 추가하는 함수
testVector.push_back(2);
testVector.push_back(3);
testVector.push_back(4);
testVector.push_back(5);
testVector.push_back(6);
testVector.push_back(7);
testVector.push_back(8);
testVector.push_back(9);
for(std::vector<int>::iterator it = testVector.begin(); it != testVector.end(); it++){
if(count == 5){//index가 5이면 데이터를 삭제
it = testVector.erase(it);
break;
}else{
count++;
}
}
for(int data : testVector){//for문을 이용해서 로그에 모든 데이터를 출력해준다.
std::cout << "testVector data:" << data <<"index:"<< i << std::endl;
i++;
}
count = 0;
i = 0;
for(std::vector<int>::iterator it = testVector.begin(); it != testVector.end(); it++){
if(count == 5){//index가 5이면 데이터를 추가
testVector.insert(it,6);
break;
}else{
count++;
}
}
for(int data : testVector){//for문을 이용해서 로그에 모든 데이터를 출력해준다.
std::cout << "testVector data:" << data <<"index:"<< i << std::endl;
i++;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
위의 실행 로그를 보시면 data가 1에서부터 9까지 찍히는데 중간에 6이 하나 빠져있죠?? 위의 코드에서 중간에
데이터를 삭제를 했기때문에 6이 빠진 내용이고 두번째 찍힌 로그에는 중간에 데이터를 추가해서
숫자 6이라는 데이터가 추가된것을 볼수 있습니다.
데이터를 삭제하는 것은 아래 코드처럼 구현을 하였습니다.
1
2
3
4
5
6
7
8
|
for(std::vector<int>::iterator it = testVector.begin(); it != testVector.end(); it++){
if(count == 5){//index가 5이면 데이터를 삭제
it = testVector.erase(it);
break;
}else{
count++;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
반복자를 사용함으로 for문을 무조건 넣어주어야합니다.
반복자를 사용해서 제가 만든 vector가 첫번째 원소를 가리키게 선언한 후에 vector가 제일 마지막 원소가 되기전까지
반복문들 돌려주면 됩니다. 왜 제일 마지막원소냐 하면은 벡터의 end는 제일 마지막 즉 vector원소의 플러스 1이 되는
원소이어서 비어있는 원소 입니다. 그래서 이 반복자가 제일 마지막 즉 end를 가르키면 vector원소를 모두 참조했다고
봐도 무방합니다.
그래서 vector의 원소를 모두 참조했다면 for문을 종료하도록 위처럼 코딩하고 vector의 원소를 한개씩 참조할때마다
count를 1씩 늘려주어서 count가 5가되면 데이터를 삭제하게 구현 하였습니다.
vector의 데이터를 추가하는 내용도 위와 비슷하게 프로그래밍을 구현해 줍니다.
1
2
3
4
5
6
7
8
|
for(std::vector<int>::iterator it = testVector.begin(); it != testVector.end(); it++){
if(count == 5){//index가 5이면 데이터를 추가
testVector.insert(it,6);
break;
}else{
count++;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
위의 삭제와 비슷하게 반복자를 사용해서 for문을 돌려준다음에 안의 내용에 insert하는 방법으로 데이터를 추가하였습니다.
여기까지 vector의 기본 사용법에대해서 설명 드렸는데요
iterator가 조금 어려운 부분이 있지만 많이 쓰시다보면 익숙해지실테니 프로그래밍 하면서 어렵더라고 계속 쓰시는
방법으로 코딩을 하시면 언젠가는 iterator를 아주 간단히 사용하시는 날이 올수 있을것 입니다.
여기까지 읽어주셔서 감사합니다.
다음 포스팅에는 c++ 컨테이너중에 하나인 list를 포스팅 하겠습니다.
감사합니다.
'C++ > C++심화' 카테고리의 다른 글
[C++]9. C++ #if #define 사용하기(전처리 지시문 사용하기) (0) | 2019.09.02 |
---|---|
[C++]8. C++ list사용하기 (0) | 2019.08.24 |
[C++]6. vector 사용하기(구조체 vector사용 하기) (0) | 2019.07.14 |
[C++]5. Enum값 사용하기 (0) | 2019.06.19 |
[C++] 4. null 과 nullptr의 차이점 (0) | 2019.06.09 |