[C++]10. vector 사용하기2(구조체 vector중간 원소 삭제하기,특정원소 삭제하기)
안녕하세요 고급개발자가 꿈인 코린이 입니다.
아주 작은 블로그이고 정보도 별로 없지만 찾아주신 모든 분들께 감사드립니다.
오늘은 vector를 주제로 다시한번 포스팅을 하려고합니다.
지난 포스팅에 구조체 vector를 사용하는 방법과 vector의 중간원소 삭제하는 포스팅을 했었는데요
막상 다시 읽고 다시 보니까 많이 부족한 부분이 있어서 초보 프로그래머들이 필요할 것같은 내용을 준비해 보았습니다.
구조체 vector를 먼저 포스팅하고 중간원소 삭제할때는 int형 vector를 가지고 삭제를 해서 만약에 구조체 vector의 특정
원소를 삭제할때는 어떻게 해야할지 의문이 드실 분들이 많을것같아서 구조체 vector의 중간원소 삭제 내용을 다루어
보려고합니다.
구조체 vector의 특정원소 삭제는 현업에서 아주 많이 사용합니다. 예를 들어 다른앱이나 센터에서 값을 array로 던저
주었다면 이것을 vector를 이용해서 담고 db에 담고 그러는데요 만약 센터나 다른앱에서 구조체 vector의 특정 원소를
제거하라는 이벤트가 날라오면 어떻게 해야할까요?? 이내용은 지난번 int형 vector를 삭제하는 내용을 응용해보면
됩니다.
아래코드를 보면서 설명 드리겠습니다.
ServiceClass.hpp
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
|
#ifndef SERVICECLASSCECLASS_H
#define SERVICECLASSCECLASS_H
#include <iostream>
#include <vector>
struct VectorStruct{
int id = 0;
std::string name = "";
std::string address = "";
int age = 0;
std::string birthday = "";
std::vector<std::string> vfriend;
};
class ServiceClass
{
public:
ServiceClass();
virtual ~ServiceClass();
private:
int mValue1;
int mValue2;
public:
void vectorTest();
};
#endif // SERVICECLASSCECLASS_H
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
ServiceClass.cpp
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
#include "ServiceClass.h"
ServiceClass::ServiceClass()
{
vectorTest();
}
ServiceClass::~ServiceClass()
{
}
void ServiceClass::vectorTest()
{
std::vector<VectorStruct> testVector1;//구조체 벡터 선언
std::vector<std::string> vfriends1,vfriends2;
VectorStruct vectorStruct;//구조체 선언
vectorStruct.id = 1;//특정한 id를 지우기 위해 설정한 고유값
vectorStruct.name = "홍길동";//구조체에 데이터들을 담아줌
vectorStruct.address = "서울시 서울구 서울동";
vectorStruct.age = 20;
vectorStruct.birthday = "20000405";
vfriends1.push_back("사람1");
vfriends1.push_back("사람2");
vectorStruct.vfriend = vfriends1;
VectorStruct vectorStruct1;
vectorStruct1.name = "세종대왕";
vectorStruct1.id = 2;//특정한 id를 지우기 위해 설정한 고유값
vectorStruct1.address = "제주시 제주구 제주동";
vectorStruct1.age = 22;
vectorStruct1.birthday = "19980301";
vfriends2.push_back("사람3");
vfriends2.push_back("사람4");
vectorStruct1.vfriend = vfriends2;
testVector1.push_back(vectorStruct);//구조체 벡터에 구조체들음 담아줌
testVector1.push_back(vectorStruct1);//구조체 벡터에 구조체들음 담아줌
for(int i = 1; i < 6; i++){//원소 6개 추가
VectorStruct vectorStruct1;
vfriends2.clear();
vectorStruct1.name = "아무개" + std::to_string(i);
vectorStruct1.id = i+2;//특정한 id를 지우기 위해 설정한 고유값
vectorStruct1.address = "제주시 제주구 제주동";
vectorStruct1.age = 22+i;
vectorStruct1.birthday = "1998030" + std::to_string(i);
vfriends2.push_back("사람" + std::to_string(i+4));
vfriends2.push_back("사람" + std::to_string(i+5));
vectorStruct1.vfriend = vfriends2;
testVector1.push_back(vectorStruct1);//구조체 벡터에 구조체들음 담아줌
}
for(int i = 0; i < testVector1.size(); i++){
std::cout <<"=============="<< i+1 << "번째 원소 ==================="<<std::endl;
std::cout << "testVector1[" << i << "].id :" << testVector1[i].id << std::endl;
std::cout << "testVector1[" << i << "].name :" << testVector1[i].name << std::endl;
std::cout << "testVector1[" << i << "].address :" << testVector1[i].address << std::endl;
std::cout << "testVector1[" << i << "].age :" << testVector1[i].age << std::endl;
std::cout << "testVector1[" << i << "].birthday :" << testVector1[i].birthday << std::endl;
for(int j =0; j < testVector1[i].vfriend.size(); j++){
std::cout << "testVector1[" << i << "].vfriend[" << j << "] :" << testVector1[i].vfriend[j] << std::endl;
}
}
std::cout<<"############################## 특정원소 삭제 ##########################"<<std::endl;
for(std::vector<VectorStruct>::iterator it = testVector1.begin(); it != testVector1.end(); it++){
if(it->id == 4)//구조체 vector의 id값이 4인 원소를 삭제
it = testVector1.erase(it);
for(int i = 0; i < it->vfriend.size(); i++){
if(it->vfriend.at(i).compare("사람3") == 0)//구조체 vector안의 vector의 원소가 사람3과 같으면 그 원소 삭제
it = testVector1.erase(it);
}
}
for(int i = 0; i < testVector1.size(); i++){
std::cout <<"=============="<< i+1 << "번째 원소 ==================="<<std::endl;
std::cout << "testVector1[" << i << "].id :" << testVector1[i].id << std::endl;
std::cout << "testVector1[" << i << "].name :" << testVector1[i].name << std::endl;
std::cout << "testVector1[" << i << "].address :" << testVector1[i].address << std::endl;
std::cout << "testVector1[" << i << "].age :" << testVector1[i].age << std::endl;
std::cout << "testVector1[" << i << "].birthday :" << testVector1[i].birthday << std::endl;
for(int j =0; j < testVector1[i].vfriend.size(); j++){
std::cout << "testVector1[" << i << "].vfriend[" << j << "] :" << testVector1[i].vfriend[j] << std::endl;
}
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
위의 코드를 보겠습니다.
알기쉽게 설명 드리기위해서 for문으로 구조체 vector를 총 5개를 더 추가해서 구조체 vector가 7개가 되었습니다.
여기서 특정원소를 삭제하기 위해서 구조체에 id를 추가해 줍니다.
1
2
3
4
5
6
7
8
|
struct VectorStruct{
int id = 0;
std::string name = "";
std::string address = "";
int age = 0;
std::string birthday = "";
std::vector<std::string> vfriend;
};
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
id값은 대부분이 고유값을 사용하기 때문에 고유 값이라고 생각을 해줍니다. (물론 중복이 될수도 있으므로 무조건 고유값이라고 생각해서 코딩을 하시면 위험한 코드 입니다.)
그리고 구조체 vector를 기존 2개에서 5개를 더 추가해 줍니다.
소스코드는 이전에 구조체 vector를 설명한 소스코드를 사용하였습니다.
https://youonlyliveonce1.tistory.com/27
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
for(int i = 1; i < 6; i++){//원소 6개 추가
VectorStruct vectorStruct1;
vfriends2.clear();
vectorStruct1.name = "아무개" + std::to_string(i);
vectorStruct1.id = i+2;//특정한 id를 지우기 위해 설정한 고유값
vectorStruct1.address = "제주시 제주구 제주동";
vectorStruct1.age = 22+i;
vectorStruct1.birthday = "1998030" + std::to_string(i);
vfriends2.push_back("사람" + std::to_string(i+4));
vfriends2.push_back("사람" + std::to_string(i+5));
vectorStruct1.vfriend = vfriends2;
testVector1.push_back(vectorStruct1);//구조체 벡터에 구조체들음 담아줌
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
그리고 그 구조체 vector에서 id 값이 4인것을 지우고
또한 구조체 vector의 vector의 원소중에 사람3인 값을 지우겠습니다. 아래와 같이 해주시면 됩니다.
1
2
3
4
5
6
7
8
|
for(std::vector<VectorStruct>::iterator it = testVector1.begin(); it != testVector1.end(); it++){
if(it->id == 4)//구조체 vector의 id값이 4인 원소를 삭제
it = testVector1.erase(it);
for(int i = 0; i < it->vfriend.size(); i++){
if(it->vfriend.at(i).compare("사람3") == 0)//구조체 vector안의 vector의 원소가 사람3과 같으면 그 원소 삭제
it = testVector1.erase(it);
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
여기서 compare()는 std::string 값을 비교하는 것으로 0값으로 리턴하면 같은 값이 됩니다.
이렇게 구조체 vector에서 특정원소를 삭제하는 방법입니다.
막상 작성하니 쉬운느낌이 들지만 초보 프로그래머분들은 솔직히 int형 vector삭제보다는 구조체 vector의 특정원소를
삭제하는 방법을 더 찾으실것 같아서 vector부분에 추가로 포스팅을 하였습니다.
여기 까지 읽어주셔서 정말 감사드리고
다음번 포스팅에도 초보 프로그래머분들께서 이해하기 쉽고 꼭 알아두었으면 좋을 내용들을 가져오겠습니다.
감사합니다.!!
'C++ > C++심화' 카테고리의 다른 글
[C++]12. C++ 소스코드에서 linux 명령어 실행 하는 방법 (0) | 2019.10.20 |
---|---|
[C++]11. 프로세스와 스레드(멀티 프로세싱? 멀티 스레드?) (0) | 2019.09.29 |
[C++]9. C++ #if #define 사용하기(전처리 지시문 사용하기) (0) | 2019.09.02 |
[C++]8. C++ list사용하기 (0) | 2019.08.24 |
[C++]7. vector 사용하기(vector에서 중간 원소 삭제하기) (0) | 2019.08.17 |