【c++ 回顾】STL 常用算法

40 篇文章 0 订阅
5 篇文章 0 订阅
把vector里面的数字都乘以2
#include <vector>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    vector<int> xs{ 1,2,3,4,5 };
    transform(begin(xs), end(xs), begin(xs), [](int x) {return x * 2; });
    return 0;
}

transform的第三个参数也可以是别的容器的某个位置,如果你确保目标容器有足够的位置的话,transform还能一边执行你的函数一边复制。

把vector的奇数复制到另一个vector
#include <vector>
#include <algorithm>
#include <vector>
#include <iterator>

using namespace std;

int main()
{
    vector<int> xs{ 1,2,3,4,5 };
    vector<int> ys;
    copy_if(begin(xs), end(xs), back_inserter(ys), [](int x) {return x % 2 == 1; });
    return 0;
}

copy_if还有很多类似的办法,可以不要条件,还可以控制方向等等。

大家可能会注意到这里使用了back_inserter函数。这是<iterator>里面的一个函数,从一个容器返回一个特殊的迭代器,会在迭代器内容被修改的时候去调用容器的push_back函数。上一页的transform自然也可以配合它来使用。<iterator>文件里面还有很多类似的迭代器,这样你就不需要在容器预先留好空间了(很多容器也无法预留,譬如说链表)。

把vector的所有奇数放在前面,偶数放在后面
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    vector<int> xs{ 1,2,3,4,5 };
    partition(begin(xs), end(xs), [](int x) {return x % 2 == 1; });
    return 0;
}

partition函数把所有 lambda 表达式返回true的都放在了前面,然后它会返回给你一个 iterator,指向摆放好之后第一个false的元素的位置。需要注意的是,尽管xs一开始是有顺序的,但是partition一下之后,顺序是不保证的。

把vector的所有字符串使用空格连接在一起
#include <vector>
#include <numeric>
#include <iostream>
#include <string>

using namespace std;

int main()
{
    vector<string> xs{ "I","am","a","C++","programmer" };
    cout <<
        accumulate(
            begin(xs),
            end(xs),
            string(),
            [](const string& a, const string& b)
            {
                return a == "" ? b : a + " " + b;
            }
        )
        << "!" << endl;
    return 0;
}

这个程序会输出I am a C++ programmer!。别看accumulate是从<numeric>来的,但是既然是通用算法,就没有任何理由不能用在字符串上面。当然正常的用法是:

  • 给0和加法求和(任何数字加上0没有变化)
  • 给1和乘法求积(任何数字加上1没有变化)

这样的东西。我们给的 lambda 表达式自然也要符合这个规律。accumulate的第三个参数是一个空字符串,然后我们使用 lambda 表达式保证了,任何字符串跟这个空字符串弄在一起不会变化。

文档参考
https://docs.microsoft.com/en-us/cpp/standard-library/algorithm?view=vs-2019

以上来自计蒜客 ?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值