修正序列算法
修正序列算法的有些操作会改变容器的内容。例如,把一个容器的部分内容复制到同一个容器的另一个部分,或者用指定值填充容器。
| 函数 | 算法 |
|---|---|
| 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 |