algorithm 修改序列的操作

修正序列算法

修正序列算法的有些操作会改变容器的内容。例如,把一个容器的部分内容复制到同一个容器的另一个部分,或者用指定值填充容器。

函数 算法
copy(first, last, first2) 复制
copy_backward(first, last, first2) 逆向复制
fill(first, last, val) 改填元素值
generate(first, last, func) 以指定动作的运算结果填充特定范围内的元素
partition(first, last, pred) 切割
random_shuffle(first, last) 随机重排
remove(first, last, val) 移除某种元素,但不删除
replace(first, last, val1, val2) 取代某种元素
rotate(first, middle, last) 旋转
reverse(first, last) 颠倒元素次序
swap(it1, it2) 置换
swap_ranges(first, last, first2) 置换指定范围
transform(first, last, first2, func) 以两个序列为基础,交互作用产生第 3 个序列
unique(first, last) 将重复的元素折叠压缩,变成唯一的


fill(first, last, val)

把值 val 复制到迭代器 first 和 last 指明范围内的各个元素中。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void Test_fill()
{
    vector<int> int_vector;
    for (size_t i = 0; i < 10; i++) int_vector.push_back(i);

    cout << "Vector:";
    for (int item : int_vector) cout << item << ' ';
    cout << endl;

    fill(int_vector.begin(), int_vector.begin() + 5, 0);

    cout << "Vector:";
    for (int item : int_vector) cout << item << ' ';
    cout << endl;
}
Output
Vector:0 1 2 3 4 5 6 7 8 9
Vector:0 0 0 0 0 5 6 7 8 9


random_shuffle(first, last)

把迭代器 first 和 last 指明范围内的元素顺序随机打乱。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void Test_random_shuffle()
{
    vector<int> int_vector;
    for (size_t i = 0; i < 10; i++) int_vector.push_back(i);

    cout << "Vector:";
    for (int item : int_vector) cout << item << ' ';
    cout << endl;

    random_shuffle(int_vector.begin(), int_vector.end());

    cout << "Vector:";
    for (int item : int_vector) cout << item << ' ';
    cout << endl;
}
Output
Vector:0 1 2 3 4 5 6 7 8 9
Vector:8 1 9 2 0 5 7 3 4 6


partition(first, last, pred)

把一个容器划分成两部分,第 1 部分包含令谓词 pred 返回 true 值的元素,第 2 部分包含令谓词 pred 返回 false值的元素。函数返回的迭代器指向两部分的分界点元素。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool greater5(int value)
{
    return value > 5;
}

void Test_partition()
{
    vector<int> int_vector;
    for (size_t i = 0; i < 10; i++) int_vector.push_back(i);
    random_shuffle(int_vector.begin(), int_vector.end());

    cout << "Vector:";
    for (int item : int_vector) cout << item << ' ';
    cout << endl;

    partition(int_vector.begin(), int_vector.end(), greater5);

    cout << "Vector:";
    for (int item : int_vector) cout << item << ' ';
    cout << endl;
}
Output
Vector:8 1 9 2 0 5 7 3 4 6
Vector:8 6 9 7 0 5 2 3 4 1


rotate(first, middle, last)

把从 middle 到 last 范围内的元素做旋转运算,并放置到从 first 开始的子序列中。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void Test_rotate()
{
    vector<int> int_vector;
    for (size_t i = 0; i < 10; i++) int_vector.push_back(i);

    cout << "Vector:";
    for (int item : int_vector) cout << item << ' ';
    cout << endl;

    rotate(int_vector.begin(), int_vector.begin() + 5, int_vector.end());

    cout << "Vector:";
    for (int item : int_vector) cout << item << ' ';
    cout << endl;
}
Output
Vector:0 1 2 3 4 5 6 7 8 9
Vector:5 6 7 8 9 0 1 2 3 4


相关参考

微软文档(algorithm)

cppreference(algorithm)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 算法 头文件 (STL算法部分主要由头文件,,组成。要使用STL中的算法函数必须包含头文件,对于数值算法须包含,中...
    Wancho阅读 3,304评论 0 1
  • 排序算法 排序算法的特点是对容器的内容进行不同方式的排序,例如 Sort()。 sort(first, last)...
    NINOMAE阅读 2,224评论 0 0
  • 一、 变易算法所谓变易算法是指那些改变容器中的对象的操作。 1.1 copy组 template <class I...
    林小七Raul阅读 3,101评论 0 0
  • 非修正序列算法 非修正序列算法不修改他们所作用的容器,例如计算元素个数和查找元素的函数。 adjacent_fin...
    NINOMAE阅读 2,586评论 0 0
  • 容器的概念所谓STL容器,即是将最常运用的一些数据结构(data structures)实现出来。容器是指容纳特定...
    饭饭H阅读 2,920评论 0 0