赞
踩
std::vector<int> v {1,0,9,0,9,1,0,1};
fill(begin(v)+2, begin(v)+7, 2);
for (int x : v) { cout << x << ' '; } // 1 0 2 2 2 2 2 1
std::vector<int> v {1,0,9,0,9,1,0,1};
fill_n(begin(v)+2, 5, 2);
for (int x : v) { cout << x << ' '; } // 1 0 2 2 2 2 2 1
示例:C++14 lambda作为生成器Generator
注:C++生成器和Python的生成器概念上很像,都是保存一个算法用于生成数据。
auto gen = [i=0]() mutable { i += 2; return i; };
// init-^^^ ^^^^^^^⇒ member 'i' changeable!
cout << gen(); // 2
cout << gen(); // 4
cout << gen(); // 6
运行示例代码
示例:函数类用作生成器
class int_range_generator { int val_ = 0; int step_ = 1; public: int_range_generator () = default; explicit constexpr int_range_generator (int start, int step=1) noexcept: val_{start}, step_{step} {} constexpr int operator () () noexcept { int const old = val_; val_ += step_; return old; } }; auto gen = int_range_generator{2,2}; cout << gen(); // 2 cout << gen(); // 4 cout << gen(); // 6
auto gen = [i=0]() mutable { i += 2; return i; };
std::vector<int> v;
v.resize(7,0);
generate(begin(v)+1, begin(v)+5, gen);
for (int x : v) { cout << x << ' '; } // 0 2 4 6 8 0 0
auto gen = [i=0]() mutable { i += 2; return i; };
std::vector<int> v;
v.resize(7,0);
generate_n(begin(v)+1, 4, gen);
for (int x : v) { cout << x << ' '; } // 0 2 4 6 8 0 0
该算法在其他编程语言中也称为 map。
输出目标必须能够接收与输入范围中的元素数量相同的数量。
函数(对象)f 不能有副作用 / 不能是有状态的,因为它应用于输入元素的顺序是不能保证的。
// f: 'x' → "<x>"
auto f = [](char c) { return std::string("<") + c + ">"; };
std::string in = "vwxyza";
std::vector<std::string> out;
// make sure 'out' can fit result
out.resize(4);
transform(begin(in)+1, begin(in)+5, begin(out), f);
for (auto const& x : out) { cout << x << ' '; } // <w> <x> <y> <z>
// f: 'y',3 → "yyy"
auto f = [](char c, int i) { return std::string(i,c); };
std::string in1 = "wxy";
std::vector<int> in2 = {1,2,3};
std::vector<std::string> out;
// make sure 'out' can fit result
out.resize(3);
transform(begin(in1), end(in1), begin(in2), begin(out), f);
for (auto const& x : out) { cout << x << ' '; } // w xx yyy
运行示例代码
cppreference
cppreference
std::vector<int> v {1,2,3,2,4,2,2,6};
replace(begin(v)+2, begin(v)+7, 2, 0);
for (int x : v) { cout << x << ' '; } // 1 2 3 0 4 0 0 6
输出目标必须能够接收与输入范围中元素数量相等的元素。
std::vector<int> in {1,2,3,2,4,2,2,6,7};
std::vector<int> out;
out.resize(5);
replace_copy(begin(in)+2, begin(in)+7, begin(out), 2, 0);
for (int x : out) { cout << x << ' '; } // 3 0 4 0 0
auto const is_even = [](int x) { return !(x & 1); };
std::vector<int> in {2,3,2,5,4,6,6};
std::vector<int> out;
out.resize(5);
replace_copy_if (begin(in)+1, begin(in)+7, begin(out), is_even, 0);
for (int x : out) { cout << x << ' '; } // 3 0 5 0 0
视频:generate & generate_n by Conor Hoekstra
标准算法概述
C++标准库算法介绍
标准序列容器(vector、deque、list、…)
标准关联容器(map、set、…)
标准序列视图
cppreference:算法库
cppreference:容器库
视频:什么是 C++ 标准库?
视频:一小时内掌握 105 个 STL 算法 (Jonathan Boccara,2018)
C++ 之旅:容器和算法
算法概述表:
附上原文链接
如果文章对您有用,请随手点个赞,谢谢!^_^
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。