#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <iterator>
using namespace std;
using namespace std::placeholders;
int main()
{
vector<int> ivec{ 3, 2, 1, 4, 5, 5, 2, 6 };
vector<int> subivec{ 5, 2, 6 };
vector<int> ivec2{ 1, 2, 4, 4, 4, 5, 6, 7 };
vector<int> ivec3;
vector<int> ivec4;
auto it1 = find_if_not(ivec.begin(), ivec.end(), [](int c){ return c >= 3; });
auto it2 = find_if_not(ivec.begin(), ivec.end(), bind2nd(greater_equal<int>(), 3));
auto it3 = find_if_not(ivec.begin(), ivec.end(), bind(greater_equal<int>(),_1,3));
//全部输出:2
if (it1 != ivec.end())
cout << *it1 << endl;
if (it2 != ivec.end())
cout << *it2 << endl;
if (it3 != ivec.end())
cout << *it3 << endl;
cout << endl;
//输出:0 1 0
cout << all_of(ivec.begin(), ivec.end(), [](int c){ return c >= 3; }) << endl;
cout << any_of(ivec.begin(), ivec.end(), [](int c){ return c >= 3; }) << endl;
cout << none_of(ivec.begin(), ivec.end(), [](int c){ return c >= 3; }) << endl;
cout << endl;
auto it4 = adjacent_find(ivec.begin(), ivec.end());
auto it5 = adjacent_find(ivec.begin(), ivec.end(), [](int a, int b){return a + 1 == b; });
//输出:5 4
if (it4 != ivec.end())
cout << *it4 << endl;
if (it5 != ivec.end())
cout << *it5 << endl;
cout << endl;
auto it6 = search(ivec.begin(), ivec.end(), subivec.begin(), subivec.end());
auto it7 = find_end(ivec.begin(), ivec.end(), subivec.begin(), subivec.end());
auto it8 = find_first_of(ivec.begin(), ivec.end(), subivec.begin(), subivec.end());
//输出:5 5 2
if (it6 != ivec.end())
cout << *it6 << endl;
if (it7 != ivec.end())
cout << *it7 << endl;
if (it8 != ivec.end())
cout << *it8 << endl;
cout << endl;
//输出:3, 2, 1, 4, 5, 5, 2, 6
for_each(ivec.begin(), ivec.end(), [](int c){cout << c << " "; });
cout << endl;
//输出:3, 2, 1, 4, 5, 5, 2, 6
copy(ivec.begin(), ivec.end(), ostream_iterator<int>(cout, " "));
cout << endl;
//输出:0
cout << equal(ivec.begin(), ivec.end(), subivec.begin()) << endl;
cout << endl;
//必须是有序的!此时ivec2 = {1, 2, 4, 4, 4, 5, 6, 7 }
auto it9 = lower_bound(ivec2.begin(), ivec2.end(), 3);
auto it10 = upper_bound(ivec2.begin(), ivec2.end(), 3);
auto it11 = equal_range(ivec2.begin(), ivec2.end(), 4);
//输出:4 4
if (it9 != ivec2.end())
cout << *it9 << endl;
if (it10 != ivec2.end())
cout << *it10 << endl;
//输出:3 3 注意在有序区间计算对象的个数优先采用distance方法
cout << distance(it11.first, it11.second) << endl;
cout << count(ivec2.begin(), ivec2.end(), 4) << endl;
cout << endl;
//输出:2 3 5 5 5 6 7 8 ivec3
transform(ivec2.begin(), ivec2.end(), back_inserter(ivec3),[](int &c){return c + 1; });
for_each(ivec3.begin(), ivec3.end(), [](int c){cout << c << " "; });
cout << endl;
//输出:2 6 20 20 20 30 42 56 ivec4
transform(ivec2.begin(), ivec2.end(), ivec3.begin(), back_inserter(ivec4), multiplies<>());
for_each(ivec4.begin(), ivec4.end(), [](int c){cout << c << " "; });
cout << endl;
merge(ivec3.begin(), ivec3.end(), ivec4.begin(), ivec4.end(), ostream_iterator<int>(cout, " "));
cout << endl << endl;
iter_swap(it4, it5);
//输出:4 5
cout << *it4 << endl << *it5 << endl;
//此时ivec为3 2 1 5 4 5 2 6
//ivec2为1 2 4 4 4 5 6 7
swap_ranges(it11.first, it11.second, it1);
//输出:3 4 4 4 4 5 2 6
for_each(ivec.begin(), ivec.end(), [](int c){cout << c << " "; });
cout << endl;
//输出:1 2 2 1 5 5 6 7
for_each(ivec2.begin(), ivec2.end(), [](int c){cout << c << " "; });
cout << endl;
//此时ivec4为 2 6 20 20 20 30 42 56
replace_if(ivec4.begin(), ivec4.end(), bind(greater<int>(),_1,10), 0);
//输出: 2 6 0 0 0 0 0 0
for_each(ivec4.begin(), ivec4.end(), [](int c){cout << c << " "; });
cout << endl;
//输出: 0 0 0 0 0 0 0 0
replace_if(ivec4.begin(), ivec4.end(), [](int c){return c > 0; }, 0);
for_each(ivec4.begin(), ivec4.end(), [](int c){cout << c << " "; });
cout << endl;
return 0;
}
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <numeric>
using namespace std;
using namespace std::placeholders;
int main()
{
vector<int> ivec{ 1, 2, 3, 4, 5, 6, 7, 8 };
vector<int> ivec2{ 1, 2, 3, 4, 3, 2, 1 };
//输出:2 4 6 8 1 3 5 7
stable_partition(ivec.begin(), ivec.end(), [](int c){return c % 2 == 0; });
for_each(ivec.begin(), ivec.end(), [](int c){cout << c << " "; });
cout << endl;
ivec = { 1, 2, 3, 4, 5, 6, 7, 8 };
//输出:1
cout << is_sorted(ivec.begin(), ivec.end()) << endl;
//输出:3
auto it = is_sorted_until(ivec2.begin(), ivec2.end());
if (it != ivec2.end())
cout << *it << endl;
//只排序前4个元素
partial_sort(ivec2.begin(), ivec2.begin() + 4, ivec2.end());
//输出:1 1 2 2 4 3 3
for_each(ivec2.begin(), ivec2.end(), [](int c){cout << c << " "; });
cout << endl;
//输出:2 2 4 3 3 3 1 1
rotate(ivec2.begin(), ivec2.begin() + 2, ivec2.end());
for_each(ivec2.begin(), ivec2.end(), [](int c){cout << c << " "; });
cout << endl;
//输出: 1 1 3 3 3 4 2 2
reverse(ivec2.begin(), ivec2.end());
for_each(ivec2.begin(), ivec2.end(), [](int c){cout << c << " "; });
cout << endl;
//输出: Min:1 Max:4
auto it3 = minmax_element(ivec2.begin(), ivec2.end());
cout << "Min: " << *it3.first << endl << "Max: " << *it3.second << endl;
//输出:10 11 12 13 14 15 16
iota(ivec2.begin(), ivec2.end(), 10);
for_each(ivec2.begin(), ivec2.end(), [](int c){cout << c << " "; });
cout << endl;
return 0;
}