Data+

25. STL 변경 가능 시퀀스 알고리즘

by Qerogram

1. Generate

- assign은 같은 값으로 도배를 한다. 하지만 같은 값이 아니라면?

generate를 활용한다. generate(컨테이너 시작, 끝, 값);

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
#include <iostream>
#include <algorithm>
#include <vector>
#include <stdio.h>
using namespace std;
 
struct User {
    int UID;
    int RaceType;
    int Sex;
    int Money;
};
 
struct SetUserInfo {
    SetUserInfo() { UserCount = 0; }
    User operator() () {
        User user;
        ++UserCount;
        user.UID = UserCount;
        user.Money = 2000;
        if0 == (UserCount%2)) {
            user.RaceType = 1;
            user.Sex = 1;
            user.Money += 1000;
        }
        else {
            user.RaceType =0;
            user.Sex = 0;
        }
        return user;
    }
    int UserCount;
};
 
int main() {
   vector<User> Users(5);
   
   generate(Users.begin(), Users.end(), SetUserInfo());
   char szUserInfo[256= {0, };
   vector<User>::iterator IterUser;
   for(IterUser = Users.begin(); IterUser != Users.end(); ++IterUser) {
       sprintf(szUserInfo, "UID %d, RaceType : %d, Sex %d, Money : %d", IterUser->UID, IterUser->RaceType, IterUser->Sex, IterUser->Money);
       cout << szUserInfo << endl;
   }
   
   return 0;
}
 
 
cs

- 결과

UID 1, RaceType : 0, Sex 0, Money : 2000                                                
UID 2, RaceType : 1, Sex 1, Money : 3000                                                
UID 3, RaceType : 0, Sex 0, Money : 2000                                                
UID 4, RaceType : 1, Sex 1, Money : 3000                                                
UID 5, RaceType : 0, Sex 0, Money : 2000  


2. copy

- 컨테이너에 저장한 것과 같은 자료 형을 저장하는 다른 컨테이너에 복사하고 싶을 때 사용한다.

- B에서 A를 복사하는 것이라면 A와 같은 사이즈를 가져야만 한다.

- copy(복사하려는 입력 구간 시작, 끝, 붙여 넣을 출력구간 시작 위치);

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
#include <iostream>
#include <algorithm>
#include <list>
#include <vector>
#include <stdio.h>
using namespace std;
 
int main() {
   vector<int> vec1(10);
   generate(vec1.begin(), vec1.end(), rand);
   cout << "vec1의 모든 데이터를 vec2에 copy" << endl;
   vector<int> vec2(10);
   copy(vec1.begin(), vec1.end(), vec2.begin());
   
   for(vector<int>::iterator IterPos = vec2.begin(); IterPos != vec2.end(); ++IterPos) {
       cout << *IterPos << endl;
   }
   
   cout << "vec1의 모든 데이터를 list1에 copy" << endl;
   list<int> list1(10);
   copy(vec1.begin(), vec1.end(), list1.begin());
   for(list<int>::iterator IterPos = list1.begin(); IterPos != list1.end(); ++IterPos) {
       cout << *IterPos << endl;
   }
   
   return 0;
}
 
 
cs

* 결과

vec1의 모든 데이터를 vec2에 copy                                                                
1804289383                                                                              
846930886    
1681692777                                                                              
1714636915                                                                              
1957747793                                                                              
424238335 
719885386                                                                               
1649760492                                                                              
596516649                                                                               
1189641421                                                                              
vec1의 모든 데이터를 list1에 copy
1804289383                                                                              
846930886                                                                               
1681692777                                                                              
1714636915                                                                              
1957747793
424238335                                                                               
719885386                                                                               
1649760492                                                                              
596516649                                                                               
1189641421 

3. remove

- 컨테이너에 있는 특정 값들을 삭제하고 싶을 때 사용한다.

- 삭제후 크기가 변하지 않는다. 삭제가 성고하면 삭제 대상이 아닌 데이터들을 앞으로 옮겨놓고

마지막 위치의(end()가 아닌 삭제 후 빈 공간에 다른 데이터를 쓰기 시작한 위치) 반복자를 반환한다.

- 리턴 값이 가리키는 부분부터 end() 사이의 데이터 서는 정의 되어 있지 않으며 erase를 사용해 완전삭제한다.

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
#include <iostream>
#include <algorithm>
#include <list>
#include <vector>
#include <stdio.h>
using namespace std;
 
int main() {
   vector<int> vec1;
   vec1.push_back(10); vec1.push_back(20); vec1.push_back(20);
   vec1.push_back(40); vec1.push_back(50); vec1.push_back(30);
   
   vector<int>::iterator IterPos;
   
   cout << "vec1에 있는 모든 데이터 출력" << endl;
   
   for(IterPos = vec1.begin(); IterPos != vec1.end(); ++IterPos) 
   cout << *IterPos << " " << endl;
   cout << endl;
   
   cout << "vec1에서 20 remove" << endl;
   vector<int>::iterator RemovePos = remove(vec1.begin(), vec1.end(), 20);
   
   for(IterPos = vec1.begin(); IterPos != vec1.end(); ++IterPos)
   cout << *IterPos << " " << endl;
   cout << endl;
   
   cout << "vec1에서 20 remove 이후 사용 하지 않는 영역 완전 제거" << endl;
   while(RemovePos != vec1.end()) {
       RemovePos = vec1.erase(RemovePos);
   }
   
   for(IterPos = vec1.begin(); IterPos!= vec1.end(); ++IterPos) {
       cout << *IterPos << " " << endl;
   }
   
   return 0;
   
}
 
 
cs

* 결과

vec1에 있는 모든 데이터 출력                                                                      
10                                                                                      
20                                                                                      
20                                                                                      
40                                                                                      
50                                                                                      
30 

vec1에서 20 remove                                                                        
10                                                                                      
40                                                                                      
50 
30                                                                                      
50                                                                                      
30                                                                                      
                                                                                        
vec1에서 20 remove 이후 사용 하지 않는 영역 완전 제거
10                                                                                      
40                                                                                      
50                                                                                      
30


4. replace

- 컨테이너의 특정 값을 다른 값으로 바꾸고 싶을 때 사용한다.

- replace(찾기 시작 반복자, 찾기 종료 반복자, 교체전 값, 교체후 값);

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
#include <iostream>
#include <algorithm>
#include <list>
#include <vector>
#include <stdio.h>
using namespace std;
 
int main() {
   vector<int> vec1;
   vec1.push_back(10); vec1.push_back(20); vec1.push_back(20);
   vec1.push_back(40); vec1.push_back(50); vec1.push_back(30);
   
   vector<int>::iterator IterPos;
   
   cout << "vec1에 있는 모든 데이터 출력" << endl;
   
   for(IterPos = vec1.begin(); IterPos != vec1.end(); ++IterPos) 
   cout << *IterPos << " " << endl;
   cout << endl;
   
   cout << "vec1의 세번째 요소 부터 20을 200으로 변경" << endl;
   replace(vec1.begin() + 2, vec1.end(), 20200);
   
   for(IterPos = vec1.begin(); IterPos != vec1.end(); ++IterPos) 
   cout << *IterPos << " " << endl;
   cout << endl;
   
   return 0;
   
}
 
 
cs

* 결과

vec1에 있는 모든 데이터 출력                                                        
10                                                                        
20
20                                                                        
40                                                                        
50                                                                        
30                                                                        

vec1의 세번째 요소 부터 20을 200으로 변경                                              
10                                                                        
20                                                                        
200                                                                       
40 
50                                                                        
30


* 참고 : Thinking About C++ STL Programming

'코딩 > C&C++' 카테고리의 다른 글

27. STL 범용 수치 알고리즘  (0) 2017.04.22
26. STL 정렬 관련 알고리즘  (0) 2017.04.22
24. STL 변경 불가 시퀀스 알고리즘  (0) 2017.04.21
23. STL set  (0) 2017.04.20
22. STL map  (0) 2017.04.20

블로그의 정보

Data+

Qerogram

활동하기