STL 源碼剖析 stl_numeric.h

來源:互聯網
上載者:User

標籤:style   blog   http   color   os   2014   

本文為senlie原創,轉載請保留此地址:http://blog.csdn.net/zhengsenlie


描述、源碼、樣本
version 1:普通操作版本
version 2: 泛化操作版本


1.accumulate
描述:計算 init 和 [first, last) 內所有元素的總和
源碼:

//version 1template <class InputIterator, class T>T accumulate(InputIterator first, InputIterator last, T init) {  for ( ; first != last; ++first)    init = init + *first;  return init;}//version 2template <class InputIterator, class T, class BinaryOperation>T accumulate(InputIterator first, InputIterator last, T init,             BinaryOperation binary_op) {  for ( ; first != last; ++first)    init = binary_op(init, *first);  return init;}

樣本:
int main(){  int A[] = {1, 2, 3, 4, 5};  const int N = sizeof(A) / sizeof(int);  cout << "The sum of all elements in A is "        << accumulate(A, A + N, 0) // 15       << endl;  cout << "The product of all elements in A is "       << accumulate(A, A + N, 1, multiplies<int>()) //120       << endl;}

2.inner_product
描述:計算[first1, last1) 和 [first2, first2 + (last1 - first1)) 的內積 
源碼:
//version 1template <class InputIterator1, class InputIterator2, class T>T inner_product(InputIterator1 first1, InputIterator1 last1,                InputIterator2 first2, T init) {  for ( ; first1 != last1; ++first1, ++first2)    init = init + (*first1 * *first2);  return init;}//version 2template <class InputIterator1, class InputIterator2, class T,          class BinaryOperation1, class BinaryOperation2>T inner_product(InputIterator1 first1, InputIterator1 last1,                InputIterator2 first2, T init, BinaryOperation1 binary_op1,                BinaryOperation2 binary_op2) {  for ( ; first1 != last1; ++first1, ++first2)    init = binary_op1(init, binary_op2(*first1, *first2));  return init;}

樣本:
int main(){  int A1[] = {1, 2, 3};  int A2[] = {4, 1, -2};  const int N1 = sizeof(A1) / sizeof(int);  cout << "The inner product of A1 and A2 is "        << inner_product(A1, A1 + N1, A2, 0) //0       << endl;}

3.partial_sum
描述: 計算局部總和。
源碼:
//version 1template <class InputIterator, class OutputIterator, class T>OutputIterator __partial_sum(InputIterator first, InputIterator last,                             OutputIterator result, T*) {  T value = *first;  while (++first != last) {    value = value + *first;    *++result = value;  }  return ++result;}template <class InputIterator, class OutputIterator>OutputIterator partial_sum(InputIterator first, InputIterator last,                           OutputIterator result) {  if (first == last) return result;  *result = *first;  return __partial_sum(first, last, result, value_type(first));}//version 2template <class InputIterator, class OutputIterator, class T,          class BinaryOperation>OutputIterator __partial_sum(InputIterator first, InputIterator last,                             OutputIterator result, T*,                             BinaryOperation binary_op) {  T value = *first;  while (++first != last) {    value = binary_op(value, *first);    *++result = value;  }  return ++result;}template <class InputIterator, class OutputIterator, class BinaryOperation>OutputIterator partial_sum(InputIterator first, InputIterator last,                           OutputIterator result, BinaryOperation binary_op) {  if (first == last) return result;  *result = *first;  return __partial_sum(first, last, result, value_type(first), binary_op);}

樣本:
int main(){  const int N = 10;  int A[N];  fill(A, A+N, 1);  cout << "A:                 ";  copy(A, A+N, ostream_iterator<int>(cout, " ")); // 1 2 3 4 5 6 7 8 9 10  cout << endl;   cout << "Partial sums of A: ";  partial_sum(A, A+N, ostream_iterator<int>(cout, " ")); // 1 3 6 10 15 21 28 36 45 55  cout << endl;}  

4.adjacent_difference
描述:計算[first, last) 相鄰元素的差額
源碼:
//version 1template <class InputIterator, class OutputIterator, class T>OutputIterator __adjacent_difference(InputIterator first, InputIterator last,                                      OutputIterator result, T*) {  T value = *first;  while (++first != last) {    T tmp = *first;    *++result = tmp - value;    value = tmp;  }  return ++result;}template <class InputIterator, class OutputIterator>OutputIterator adjacent_difference(InputIterator first, InputIterator last,                                    OutputIterator result) {  if (first == last) return result;  *result = *first;  return __adjacent_difference(first, last, result, value_type(first));}//version 2template <class InputIterator, class OutputIterator, class T,           class BinaryOperation>OutputIterator __adjacent_difference(InputIterator first, InputIterator last,                                      OutputIterator result, T*,                                     BinaryOperation binary_op) {  T value = *first;  while (++first != last) {    T tmp = *first;    *++result = binary_op(tmp, value);    value = tmp;  }  return ++result;}template <class InputIterator, class OutputIterator, class BinaryOperation>OutputIterator adjacent_difference(InputIterator first, InputIterator last,                                   OutputIterator result,                                   BinaryOperation binary_op) {  if (first == last) return result;  *result = *first;  return __adjacent_difference(first, last, result, value_type(first),                               binary_op);}

樣本:
int main(){  int A[] = {1, 4, 9, 16, 25, 36, 49, 64, 81, 100};  const int N = sizeof(A) / sizeof(int);  int B[N];  cout << "A[]:         ";  copy(A, A + N, ostream_iterator<int>(cout, " ")); //1 4 9 16 25 36 49 64 81 100  cout << endl;    adjacent_difference(A, A + N, B);  cout << "Differences: ";  copy(B, B + N, ostream_iterator<int>(cout, " ")); // 3 5 7 9 11 13 15 17 19  cout << endl;  cout << "Reconstruct: ";  partial_sum(B, B + N, ostream_iterator<int>(cout, " ")); //1 4 9 16 25 36 49 64 81 100  cout << endl;}

5.power 
描述:計算某數的 n 冪次方。 SGI 專屬,不在STL標準中
源碼:
// Returns x ** n, where n >= 0.  Note that "multiplication"//  is required to be associative, but not necessarily commutative.    template <class T, class Integer, class MonoidOperation>T power(T x, Integer n, MonoidOperation op) { //這裡用的是 Russian Peasant Algorithm  if (n == 0)    return identity_element(op);  else {    while ((n & 1) == 0) {      n >>= 1;      x = op(x, x);    }    T result = x;    n >>= 1;    while (n != 0) {      x = op(x, x);      if ((n & 1) != 0)        result = op(result, x);      n >>= 1;    }    return result;  }}template <class T, class Integer>inline T power(T x, Integer n) {  return power(x, n, multiplies<T>());}

樣本:
int main() {  cout << "2 ** 30 = " << power(2, 30) << endl;  // -->  我編譯不通過。說找不到標識符 power ,我已經 include 了 <numeric> }

6.iota
描述:設定某個區間的內容,使其內的每一個元素從指定的value 值 開始,呈現遞增狀態
源碼:
template <class ForwardIterator, class T>void iota(ForwardIterator first, ForwardIterator last, T value) {  while (first != last) *first++ = value++;}

樣本:
int main(){  vector<int> V(10);  iota(V.begin(), V.end(), 7);  copy(V.begin(), V.end(), ostream_iterator<int>(cout, " ")); // 7 8 9 10 11 12 13 14 15 16  cout << endl; }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.