#include "smat.h" #include #include #include #include #include #include #include #include #ifdef linux #include #endif int accumulate_stride_1(std::vector& v, int stride) { int sum = 0; for (size_t i = 0 ; i < v.size(); i += stride) sum += v[i]; return sum; } int accumulate_stride_2(std::vector::iterator first, std::vector::iterator last, int stride) { int sum = 0; for ( ; first < last; first += stride) sum += *first; return sum; } template int accumulate_stride_3(T first, T last, U stride) { int sum = 0; for ( ; first < last; first += stride) sum += *first; return sum; } template typename std::iterator_traits::value_type accumulate_stride_4(T first, T last, U stride) { typename std::iterator_traits::value_type sum(*first); first += stride; for ( ; first < last; first += stride) sum = sum + *first; return sum; } template typename std::iterator_traits::value_type accumulate_stride_final(T first, T last, typename std::iterator_traits::difference_type stride) { typename std::iterator_traits::value_type sum(*first); first += stride; for ( ; first < last; first += stride) sum = sum + *first; return sum; } int main() { int x[5] = { 3, 6, 7, 2, 4 }; float y[5] = { 3, 6, 7, 2, 3.5 }; std::vector v(&x[0], &x[5]); typedef std::vector::iterator iter; std::cerr << accumulate_stride_1(v, 2) << '\n'; std::cerr << accumulate_stride_2(v.begin(), v.end(), 2) << '\n'; std::cerr << accumulate_stride_3(&x[0], &x[5], 2) << '\n'; std::cerr << accumulate_stride_4(&y[0], &y[5], 2) << '\n'; std::cerr << accumulate_stride_4(smat(v.begin()), smat(v.end()), 2) << '\n'; std::cerr << accumulate_stride_final(smat(v.begin()), smat(v.end()), 2) << '\n'; }