25. STL 변경 가능 시퀀스 알고리즘
by Qerogram1. 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; if( 0 == (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(), 20, 200); 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