STL源码剖析 数值算法 accumulate | adjacent_difference | inner_product | partial_sum | power | itoa
生活随笔
收集整理的這篇文章主要介紹了
STL源码剖析 数值算法 accumulate | adjacent_difference | inner_product | partial_sum | power | itoa
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//版本1
template <class InputIterator,class T>
T accumulate(InputIterator first,InputIterator last,T init){for(;first != last; ++first){init += *first; //將每個元素數值累加到init身上}return init;
}//版本2
template <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;
}
- accumulate用于計算init和[first , last)內部所有元素的總和。需要提供一個init,表示當[first,last)為空的區間仍然可以獲取一個明確定義的數值,如果想獲得[first,last)內所有數值的總和,應將init設為0
- 二元操作符不必滿足交換律和結合律,是的accumulate的行為順序有著明確的定義:先將init初始化,然后針對[first,last)區間內的每一個迭代器i,依次執行init = init + *i(第一版本) 或者 init = binary_op(init, *i) (第二版本)
使用例子
#include <iostream> //std::cout #include <functional> //std::minuc #include <numeric> //std::accumulateint my_function(int x,int y){return x + 2*y;} struct my_class{int operator()(int x,int y){return x + 3*y;} }my_object;int main(){int init = 100;int numbers[] = {10,20,30}; // std::cout << << std::endl;std::cout << "using default accumulate" << std::endl;std::cout << std::accumulate(numbers,numbers+3,init) << std::endl;std::cout << "using functional's accumulate" << std::endl;std::cout << std::accumulate(numbers,numbers+3,init,std::minus<int>()) << std::endl;std::cout << "using custom function" << std::endl;std::cout << std::accumulate(numbers,numbers+3,init, my_function) << std::endl;std::cout << "using custom object" << std::endl;std::cout << std::accumulate(numbers,numbers+3,init, my_object) << std::endl;}adjacent_difference
- 用于計算[first,last)中相鄰元素的差額
- 將*first 賦值給*result,并針對[first+1,last)內的每個迭代器i 將*i-*(i-1)的數值賦值給*(result+(i-first))
- 使用就地方式 也就是讓result 等于first 函數為質變算法
- 存儲第一元素的數值然后存儲后繼元素的差值,便可=可以重建輸入區間的原始內容
- adjacent_difference 和 partial_sum互為逆運算,如果對區間1 2 3 4 5 執行adjacent_difference結果為1 1 1 1 1,如果對這個結果執行partial_sum 便會得到原始的區間數值為1 2 3 4 5
inner_product
- 執行兩個序列的一般內積
- 算法計算 [first1,last1) 和 [first2,first2 + (last1 - first1))的一般內積
- 需要提供初始數值,用于區間為空的時候得到一個明確定義的結果
partial_sum
- partial_sum用于計算局部總和,將*first賦值給*result,將*first和*(first+1)的數值的和賦值給*(result+1)
- 可以轉化為質變算法
- 函數返回 result + (last - first)
- 和先前介紹的adjacent_difference互為逆運算
?
#include <iostream> //std::cout #include <functional> //std::minuc #include <numeric> //std::adjacent_differencetemplate <class InputIterator,class OutputIterator> OutputIterator partial_sum(InputIterator first,InputIterator last,OutputIterator result){if (first != last){typename std::iterator_traits<InputIterator>::value_type val = *first;*result = val;while (++first!=last){val = val + *first;*++result = val;}++result;}return result; }template <class InputIterator,class OutputIterator,class BinaryOperation> OutputIterator partial_sum(InputIterator first,InputIterator last,BinaryOperation binary_op,OutputIterator result){if (first != last){typename std::iterator_traits<InputIterator>::value_type val = *first;*result = val;while (++first!=last){val = binary_op(val,*first);*++result = val;}++result;}return result; }//int myaccumulator(int x,int y){return x-y;} //int myproduct(int x,int y){return x+y;}int myop(int x,int y){return x+y+1;}int main(){ // int init = 100;int series1[] = {1,2,3,4,5};int result[5];std::cout << "using default partial_sum" << std::endl;std::partial_sum(series1,series1+5,result);for (int i = 0; i < 5; ++i) {std::cout << result[i] << ' ';}std::cout << std::endl;std::cout << "using functional operation multiplies" << std::endl;std::partial_sum(series1,series1+5,result,std::multiplies<int>());for (int i = 0; i < 5; ++i) {std::cout << result[i] << ' ';}std::cout << std::endl;std::cout << "using custom functions" << std::endl;std::partial_sum(series1,series1+5, result,myop);for (int i = 0; i < 5; ++i) {std::cout << result[i] << ' ';}std::cout << std::endl; // using default partial_sum // 1 3 6 10 15 // using functional operation multiplies // 1 2 6 24 120 // using custom functions // 1 4 8 13 19 }Power
- ?計算某數的n冪次方 即自己對自己進行某種運算到達n次
- 運算類型可以由外界指定,如果指定為乘法那就是 乘冪
- 目前使用pow替代
itoa
- ?用于設定某個區間的內容,使其內的每一個元素從指定的value數值開始,呈現遞增的狀態
- 質變算法
- 在[first,last)區域內填入 value ,value+1,value+2
參考鏈接
- accumulate - C++ Reference
- adjacent_difference - C++ Reference
- inner_product - C++ Reference
- https://www.cplusplus.com/reference/numeric/partial_sum/?kw=partial_sum
- pow - C++ Reference
總結
以上是生活随笔為你收集整理的STL源码剖析 数值算法 accumulate | adjacent_difference | inner_product | partial_sum | power | itoa的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis(RedisTemplate)
- 下一篇: ubuntu18.04.1的下载链接