一、常用遍历算法

1. for_each

2. transform

  • 搬运的目标容器必须要提前开辟空间(resize 而不是 reserve),否则无法正常搬运
int main()
{
    vector<int> v;
    for(int i = 0; i < 10; ++i){
        v.push_back(i);
    }
    
    vector<int> v1;
    v1.resize(v.size());    // 要用 resize, 不能用 reserve
    transform(v.begin(), v.end(), v1.begin(), [](int v){ return v * 2;});
    for_each(v1.begin(), v1.end(), [](int v){ cout << v << " "; });
    cout << endl;
    return 0;
}

二、常用查找算法

1. find

2. find_if

3. adjacent_find

  • 无序序列不可用

5. count

6. count_if

三、常用排序算法

1. sort

  • 不支持随机访问的容器不可用

2. random_shuffle 洗牌

  • 指定范围内的元素随机调整次序
  • 不支持随机访问的容器不可用
  • 如果想每次都是随机序列,就添加一个随机种子
int main()
{
    vector<int> v;
    for(int i = 0; i < 10; ++i){
        v.push_back(i);
    }
    
    vector<int> v1;
    v1.resize(v.size());
    srand((unsigned int)time(NULL));    // 设置随机种子
    random_shuffle(v.begin(), v.end());
    for_each(v.begin(), v.end(), [](int v){ cout << v << " "; });
    cout << endl;
    return 0;
}

3. merge

  • 合并的两个容器要求是有序的,合并后也是有序的
  • 两个序列的排序规则要一致
  • 目标容器也要提前开辟空间
int main()
{
    vector<int> v;
    vector<int> v1;
    for(int i = 0; i < 10; ++i){
        v.push_back(i);
        v.push_back(i + 1);
    }
    
    vector<int> v2;
    v2.resize(v.size() + v1.size()); // 目标容器开辟空间
    merge(v.begin(), v.end(), v1.begin(), v1.end(), v2.begin());
    for_each(v2.begin(), v2.end(), [](int v){ cout << v << " "; });
    cout << endl;
    return 0;
}

输出:

0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 

4. reverse

  • 不支持随机访问的容器不可用

四、常用拷贝和替换算法

1. copy

  • 目标容器要提前开辟空间
  • 等价于 = 运算符或者 拷贝构造

2. replace

3. replace_if

4. swap

五、算术生成算法 (numeric)

1. accumulate 计算容器元素累计总和

2. fill 向容器中添加元素

六、常用集合算法

1. set_intersection

  • 求两个容器的交集
  • 两个序列都是有序的,而且排序标准要一致
  • 默认是按升序处理
  • 结果交集序列也是有序的
int main()
{
    vector<int> v1;
    vector<int> v2;
    for(int i = 0; i < 10; ++i){
        v1.push_back(9 - i);
        v2.push_back(14 - i);
    }
    
    vector<int> v3;
    v3.resize(min(v1.size(), v2.size()));
    vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end()
        , v2.begin(), v2.end(), v3.begin(), [](int a, int b){ return a > b;});

    for_each(v3.begin(), itEnd, [](int v){ cout << v << " "; });
    cout << endl;
    return 0;
}

输出:

9 8 7 6 5 

2. set_union

  • 求两个容器的并集

3. set_difference

  • 求两个容器的差集