目录
一:功能
二:用法
三:实现
一:功能
遍历元素
二:用法
//C++ 11
#include <vector>
#include <algorithm>
#include <iostream>
#include <format>struct StatsFn {int cnt = 0;int sum = 0;void operator()(int v) {cnt++;sum += v;}
};int main() {std::vector<int> data = {1, 2, 3, 4, 5, 6, 7, 8, 9};auto result = std::for_each(data.begin(), data.end(), StatsFn{});std::format_to(std::ostreambuf_iterator<char>(std::cout),"Count == {}, Sum == {}\n", result.cnt, result.sum);
}
//C++ 11 lambda
#include <vector>
#include <algorithm>
#include <iostream>
#include <format>int main() {int cnt = 0, sum = 0;std::vector<int> data = {1, 2, 3, 4, 5, 6, 7, 8, 9};std::for_each(data.begin(), data.end(), [&](int el) {cnt++;sum += el;});std::format_to(std::ostreambuf_iterator<char>(std::cout),"Count == {}, Sum == {}\n", cnt, sum);
}
C++ 17 并行
#include <vector>
#include <algorithm>
#include <iostream>
#include <format>
#include <execution>int main() {std::atomic<int> cnt = 0, sum = 0;std::vector<int> data = {1, 2, 3, 4, 5, 6, 7, 8, 9};std::for_each(std::execution::par_unseq,data.begin(), data.end(), [&](int el) {cnt++;sum += el;});std::format_to(std::ostreambuf_iterator<char>(std::cout),"Count == {}, Sum == {}\n", cnt.load(), sum.load());
}
//C++20 std::ranges
#include <vector>
#include <algorithm>
#include <iostream>
#include <format>int main() {int cnt = 0, sum = 0;std::vector<int> data = {1, 2, 3, 4, 5, 6, 7, 8, 9};std::ranges::for_each(data, [&](int el) {cnt++;sum += el;});std::format_to(std::ostreambuf_iterator<char>(std::cout),"Count == {}, Sum == {}\n", cnt, sum);
}
#include <vector>
#include <iostream>
#include <format>
#include <algorithm>struct Custom {explicit Custom(double value) : value_(value) {}double getValue() { return value_; }
private:double value_;
};int main() {std::vector<Custom> data(10, Custom{1.0});double sum = 0;std::ranges::for_each(data,[&sum](auto v) { sum += v; },&Custom::getValue);// sum == 10.0std::format_to(std::ostreambuf_iterator(std::cout),"sum == {}", sum);
}
三:实现
#include <vector>
#include <algorithm>
#include <iostream>
#include <format>template<class InputIt, class UnaryFunc>
constexpr UnaryFunc my_for_each(InputIt first, InputIt last, UnaryFunc f)
{for(; first != last; ++first)f(*first);return f;
}int main()
{std::vector<int> v{3, -4, 2, -8, 15, 267};auto print = [](const int& n) { std::cout << n << ' '; };std::cout << "before:\t";my_for_each(v.cbegin(), v.cend(), print);std::cout << '\n';//increment elements in-placemy_for_each(v.begin(), v.end(), [](int &n) { n++; });std::cout << "after:\t";my_for_each(v.cbegin(), v.cend(), print);std::cout << '\n';struct Sum{void operator()(int n) { sum += n; }int sum {0};};// invoke Sum::operator() for each elementSum s = my_for_each(v.cbegin(), v.cend(), Sum()); std::cout << "sum:\t" << s.sum << '\n';
}