본문 바로가기

[ C/ C++ 프로그래밍 ]/[ STL ]

[ 혼연 정리 ] STL 알고리즘 - 4 [ 변경 알고리즘 ]


ㅇ 요소 생성

- 새로운 요소를 만들어 지정한 위치에 대입하는 함수
- 컨테이너에 삽입하는 것이 아니라 기존 요소를 파괴하고 대입한다

void fill(FwdIt first, FwdIt last, const T& val);
void fill_n(OutIt first, Size n, const T& val

- fiil : 반복자 구간을 지정한다. 구간은 이미 메모리가 확보되어 있어야 한다.
- fill_n : 시작 위치와 개수를 지정한다. 삽입 반복자 사용가능

 1 #include <iostream>
2 #include <vector>
3 #include <algorithm>
4
5 using namespace std;
6
7 template<typename C>
8 void dump(const char *desc, C c)

9 {
10     cout.width(12);cout << left << desc << "==> ";
11     copy(c.begin(),c.end(),ostream_iterator<typename C::value_type>(cout," "));
12     cout << endl;
13 }
14
15 void main()
16 {
17      int ari[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
18      vector<int> vi(&ari[0],&ari[16]);
19
20      fill(vi.begin()+2,vi.end()-5,99);
21      dump("vi",vi);
22 }



ㅇ void random_shuffle(RanIt first, RanIt last[, UniOp& op]);
 - 반복자 구간의 요소들을 무작위로 섞는다.
 - 반복자 구간은 유효해야 한다.
 - 난수로 요소를 생성해서 대입하는 것이 아니라 이미 존재하는 값들의 순서를 난수로 변경함

1 #include <Turboc.h>
2 #include <iostream>
3 #include <algorithm>
4
5 using namespace std;
6
7 void main()
8 {
9      char str[]="abcdefghijklmnopqrstuvwxyz";
10    
11      randomize();
12      puts(str);
13      random_shuffle(&str[0],&str[strlen(str)]);puts(str);
14      random_shuffle(&str[0],&str[strlen(str)]);puts(str);
15      random_shuffle(&str[0],&str[strlen(str)]);puts(str);
16 }

ㅇ void generate(FwdIt first, FwdIt last, Gen g);, void generate_n(OutIt first, Dist n, Gen g);
 - 반복자 구간에 대해 g함수를 호출하여 리턴되는 값으로 채운다.
 - g는 인수를 받지 않고 컨테이너 요소 타입을 리턴하는 함수 객체이다.
 - 다음 예제는 피보나치 수열을 만든다.

1 include <iostream>
2 #include <vector>
3 #include <algorithm>
4
5 using namespace std;
6
7 template<typename C>
8 void dump(const char *desc, C c) 9 {
10     cout.width(12);cout << left << desc << "==> ";
11     copy(c.begin(),c.end(),ostream_iterator<typename C::value_type>(cout," "));
12     cout << endl;
13 }
14
15 int fibo()
16 {
17
18      static int i1=1,i2=1;
19      int t;
20      t=i1+i2;
21      i1=i2;
22      i2=t;
23      return t;
24 }
25
26 void main()
27 {
28      vector<int> vi(10);
29
30      generate(vi.begin(),vi.end(),fibo);
31      dump("vi",vi);
32 }



ㅇ void generate(FwdIt first, FwdIt last, Gen g); , void generate_n(OutIt first, Dist n, Gen g);

- 반복자 구간에 대해 g함수를 호출하여 리턴되는 값으로 채운다.
- fil 함수와 마찬가지로 반복자 구간을 인수로 전달 받을 수도 있고 시작 위치와 개수를 인수로 받을 수도 있다.
- g는 인수를 받지 않고 컨테이너 요소 타입을 리턴하는 함수 객체이다.
- 다음 에제는 피보나치 수열을 만든다.

1 #include <iostream>
2 #include <vector>
3 #include <algorithm>
4
5 using namespace std;
6
7 template<typename C> void dump(const char *desc, C c)
8 {
9     cout.width(12);cout << left << desc << "==> ";
10     copy(c.begin(),c.end(),ostream_iterator<typename C::value_type>(cout," "));
11     cout << endl;
12 }
13
14 int fibo()
15 {
16      static int i1=1,i2=1;
17      int t;
18      t=i1+i2;
19      i1=i2;
20      i2=t;
21      return t;
22 }
23
24 void main()
25 {
26      vector<int> vi(10);
27
28      generate(vi.begin(),vi.end(),fibo);
29      dump("vi",vi);
30 }