[C++]6. vector 사용하기(구조체 vector사용 하기)
안녕하세요 고급 개발자가 꿈인 코린이 입니다.
오늘은 c++ 컨테이너 중에 하나인 vector를 사용하는 방법에 대해서 설명 드리겠습니다.
c++에서 vector는 java의 리스트와 같이 많이사용하는 것중에 하나 입니다.
실제로 실무에서 여러가지 데이터들은 담거나 담은 데이터를 다른 앱으로 ipc(프로세스간 통신)을 할때 가장 많이
사용되는 것중에 하나 입니다.
vector는 c++ 초보자들에게 조금 거리가있는 iterator를 사용하지 않아도 데이터의 특정위치의 값을 직접
참조할수 있고 데이터를 넣을수도 있습니다.
그래서 iterator에 거부감이 있는 분들도 쉽게 사용할수가 있습니다.
실제로 특정 위치의 데이터의 접근이 안되는 컨테이너들은 iterator를 이용해서 접근을 할수 있으나 iterator에 익숙하지
않는 분들은 사용하기가 좀 어렵습니다.
그래서 아주 간단히 vector에 대해서 설명 드리겠습니다.
기본적으로 vector는 반복자를 사용하지 않는다면 데이터를 stack과 같이 first in last out구조를 가지고 있습니다.
아래 코드를 보면서 설명 드리겠습니다.
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
|
#include "ServiceClass.h"
ServiceClass::ServiceClass()
{
vectorTest();
}
ServiceClass::~ServiceClass()
{
}
void ServiceClass::vectorTest()
{
std::vector<std::string> testVector1;
testVector1.push_back("testData1");
testVector1.push_back("testData2");
testVector1.push_back("testData3");
testVector1.push_back("testData4");
testVector1.push_back("testData5");
std::cout << "testVector1.size()" << testVector1.size() << std::endl;
for(int i =0; i < testVector1.size(); i++)
{
std::cout << "testVectpr[" << i << "] :" << testVector1[i] << std::endl;
}
std::cout << " testVector1.pop_back()!!!" << std::endl;
testVector1.pop_back();
std::cout << "testVector1.size()" << testVector1.size() << std::endl;
for(int i =0; i < testVector1.size(); i++)
{
std::cout << "testVectpr.at(" << i << ") :" << testVector1.at(i) << std::endl;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
위의 코드를 보시면 vector안에 데이터를 넣는 방법과 데이터들은 참조해서 로그로 출력하는 방법이 나와있습니다.
vector안에 데이터들을 어떤 데이터를 사용할지는 선언을 할때 타입을 넣어주면 됩니다. string데이터면 string을
넣어주고 int형 vector면 int를 넣어주어서 vector안에 어떠한 데이터들을 넣어줄지 설정할수 있습니다.
저는 아래와 같이 string형식의 vector를 만들어 주었습니다.
1
|
std::vector<std::string> testVector1;
|
그리고 vector안에 데이터를 넣는 방법은 아래와 같이 push_back을 사용해서 vector데이터의 제일 마지막에
데이터들을 삽입 했습니다.
1
2
3
4
5
|
testVector1.push_back("testData1");
testVector1.push_back("testData2");
testVector1.push_back("testData3");
testVector1.push_back("testData4");
testVector1.push_back("testData5");
|
그리고 담은 데이터들을 참조할때는 배열과 같이 [ ] 대괄호를 사용하거나 at을 이용해서 데이터들은 참조 할수 있습니다.
아래의 코드에 데이터를 참조하는 방법이 설명되어있습니다.
1
2
3
4
5
6
7
8
9
|
for(int i =0; i < testVector1.size(); i++)
{
std::cout << "testVectpr[" << i << "] :" << testVector1[i] << std::endl;
}
for(int i =0; i < testVector1.size(); i++)
{
std::cout << "testVectpr.at(" << i << ") :" << testVector1.at(i) << std::endl;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
위와 같이 vector의 크기 만큼을 for문을 돌려서 각 데이터를 참조하는 방법을 사용해서 데이터들을 출력하는 코드를
만들어 보았습니다.
다음은 vector안의 데이터들의 맨 마지막 데이터를 삭제하는 방법을 보겠습니다.
맨마지막 데이터를 삭제하는 것은 아래와 같습니다.
1
|
testVector1.pop_back();
|
이렇게 맨마지막 데이터를 삭제하면 로그상으로 마지막 데이터가 사라지고 vector의 크기도 줄어드는 것을 볼수 있습니다.
그렇다면 위와 같은 vector들을 이용해서 조금 심화되어서 데이터들을 다루어 보도록하겠습니다.
조금더 심화되어서 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
|
#ifndef SERVICECLASSCECLASS_H
#define SERVICECLASSCECLASS_H
#include <iostream>
#include <vector>
struct VectorStruct{
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
|
#include "ServiceClass.h"
ServiceClass::ServiceClass()
{
vectorTest();
}
ServiceClass::~ServiceClass()
{
}
void ServiceClass::vectorTest()
{
std::vector<VectorStruct> testVector1;//구조체 벡터 선언
std::vector<std::string> vfriends1,vfriends2;
VectorStruct vectorStruct;//구조체 선언
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.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 = 0; i < testVector1.size(); i++){
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
|
위와같이 람의 나이,생일,이름,주소,친구들의 정보를 담는 구조체를 만들어 줍니다.
1
2
3
4
5
6
7
8
|
struct VectorStruct{
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
|
그리고 구조체 벡터를 선언해 줍니다.
1
|
std::vector<VectorStruct> testVector1;//구조체 벡터 선언
|
위와같이 데이터타입을 넣어주는 곳에 자시이 만든 구조체를 넣어주면 구조체 벡터가 생깁니다.
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
|
std::vector<std::string> vfriends1,vfriends2;
VectorStruct vectorStruct;//구조체 선언
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.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);//구조체 벡터에 구조체들음 담아줌
|
그리고 각데이터 들을 위와 같이 넣어줍니다. 데이터들을 다른 앱에서 받아왔다면 위의 데이터 넣는 방법을 사용해서
응용해서 넣어주시면 데이터들은 담을수 있습니다.
그런다음에 아래와 같이 각 데이터들이 잘들어갔는지 로그를 찍어서 확인합니다. 위의 실행 결과와 같이
데이터가 잘들어가 있는 것을 확인할수 있습니다.
1
2
3
4
5
6
7
8
9
10
|
for(int i = 0; i < testVector1.size(); i++){
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
|
여기까지 c++에서 가장 많이 사용하는 vector에 대해서 알아보았습니다.
다음 시간에는 vector와 비슷한 list에 대해서 포스팅을 하겠습니다.
감사합니다.!
'C++ > C++심화' 카테고리의 다른 글
[C++]8. C++ list사용하기 (0) | 2019.08.24 |
---|---|
[C++]7. vector 사용하기(vector에서 중간 원소 삭제하기) (0) | 2019.08.17 |
[C++]5. Enum값 사용하기 (0) | 2019.06.19 |
[C++] 4. null 과 nullptr의 차이점 (0) | 2019.06.09 |
[C++] 3. 변수 이름 및 함수 이름 코딩 룰에 맞게 설정하기(카멜 표기법,파스칼 표기법) (0) | 2019.06.08 |