Data+

27. STL 범용 수치 알고리즘

by Qerogram

* accumulate

- 지정한 구간에 속한 값들을 모든 더한 값을 계산한다.

- 기본적으로 더하기 연산만 하지만, 조건자를 이용시 이외의 연산 가능

- 헤더 <numeric>

- accumulate(구간, 구간, 구간에 있는 값에 더할 값, 조건자);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <vector>
#include <iostream>
#include <numeric>
 
using namespace std;
 
void print(vector<int> vec) {
  for(vector<int>::iterator IterPos = vec.begin(); IterPos!=vec.end(); ++IterPos) {
    cout << *IterPos << ", ";
  }
  cout << endl << endl;
}
 
int main() {
  vector<int> vec1;
  for(int i = 1; i < 5++i) vec1.push_back(i);
  print(vec1);
  int Result1 = accumulate(vec1.begin(), vec1.end(), 0);
  cout << Result1 << endl;
  int Result2 = accumulate(vec1.begin(), vec1.end(), 10);
  cout << Result2 << endl;
  return 0;
}
cs

# 결과

1, 2, 3, 4, 

10
20

# 예시 2

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
#include <vector>
#include <iostream>
#include <numeric>
 
using namespace std;
 
struct USER {
  int UID;
  int Level;
  int Money;
};
 
struct USER_MONEY_ADD {
  USER operator()(const USER& user1, const USER& user2) {
    USER user;
    user.Money = user1.Money + user2.Money;
    return user;
  }
};
 
void print(vector<USER> vec) {
  for(vector<USER>::iterator IterPos = vec.begin(); IterPos!=vec.end(); ++IterPos) {
    cout << IterPos->Money << ", ";
  }
  cout << endl << endl;
}
 
int main() {
  USER User1; User1.Money=2000; User1.UID = 1;
  USER User2; User2.Money=2050; User2.UID = 2;
  USER User3; User3.Money=2200; User3.UID = 3;
  USER User4; User4.Money=1000; User4.UID = 4;
  USER User5; User5.Money=2030; User5.UID = 5;
  
  vector<USER> Users;
  Users.push_back(User1);
  Users.push_back(User2);
  Users.push_back(User3);
  Users.push_back(User4);
  Users.push_back(User5);
  print(Users);
  
  USER InitUser; InitUser.Money = 0;
  USER Result = accumulate(Users.begin(), Users.end(), InitUser, USER_MONEY_ADD());
  cout << Result.Money << endl;
  return 0;
}
cs

# 결과

2000, 2050, 2200, 1000, 2030, 

9280


* inner_product

- 두 입력 시퀀스의 내적을 계산하는 알고리즘으로 기본적으로는 +, *를 사용한다.

- 두 입력 시퀀스의 값은 위치의 값을 서로 곱한 값을 모두 더 한 것이 최종 계산값이 된다.

- 주의점은 두 입력 시퀀스의 구간 중 두번째 시퀀스는 첫번째 시퀀스 구간 보다 크거나 같아야한다.

- inner_product(시퀀스1 시작 반복자, 시퀀스1 끝 반복자, 시퀀스2 시작 반복자,  Type _Val);


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <vector>
#include <iostream>
#include <numeric>
 
using namespace std;
 
int main() {
  vector<int> vec1;
  for(int i = 1; i < 4++i) {
    vec1.push_back(i);
  }
  vector<int> vec2;
  for(int i = 1; i < 4++i) vec2.push_back(i);
  
  int Result = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0 );
  
  cout << Result << endl;
  return 0;
}
cs

# 결과

14

14 = 1*1+ 2*2+ 3*3이 수행된 것이다.


* 참고 : Thinking About C++ STL Programming

블로그의 정보

Data+

Qerogram

활동하기