STL 算法分类:
类别 | 常见算法 | 作用 |
---|---|---|
排序 | sort 、stable_sort 、partial_sort 、nth_element 等 |
排序 |
搜索 | find 、find_if 、count 、count_if 、binary_search 等 |
查找元素 |
修改 | copy 、replace 、replace_if 、swap 、fill 等 |
修改容器内容 |
删除 | remove 、remove_if 、unique 等 |
删除元素 |
归约 | for_each 、accumulate 等 |
处理数据 |
合并 | merge 、set_union 、set_intersection 等 |
处理有序序列 |
排列组合 | next_permutation 、prev_permutation 等 |
生成排列 |
堆操作 | push_heap 、pop_heap 、make_heap 、sort_heap 等 |
处理堆 |
在 C++ 标准库(STL)中,修改算法可以在容器中应用特定的操作,如修改元素的值、替换值、插入新元素等。
修改算法通常返回容器的迭代器,指示修改的位置或结果。
算法名称 | 功能描述 | 时间复杂度 | 空间复杂度 | 适用场景 |
---|---|---|---|---|
fill |
用指定的值填充容器中的所有元素 | O(n) | O(1) | 填充容器的所有元素 |
fill_n |
用指定的值填充容器中的部分元素 | O(n) | O(1) | 填充容器的部分元素 |
copy |
将一个范围内的元素复制到另一个范围中 | O(n) | O(1) | 将容器中的元素复制到另一个容器 |
swap |
交换两个元素的值 | O(1) | O(1) | 交换两个元素或两个容器的内容 |
replace |
替换容器中所有指定值的元素 | O(n) | O(1) | 替换容器中的指定值 |
replace_if |
替换容器中所有满足条件的元素 | O(n) | O(1) | 根据条件替换容器中的元素 |
transform |
对容器中每个元素应用操作并存储结果 | O(n) | O(1) | 对容器中每个元素进行变换 |
rotate |
将给定范围内的元素旋转指定次数 | O(n) | O(1) | 容器中元素的旋转操作 |
fill
n
是容器的元素数量。示例:
#include
using namespace std;
#include
#include
int main() {
vector<int> vec(5, 0); // 初始化为5个0
fill(vec.begin(), vec.end(), 10); // 将所有元素修改为10
for (int x : vec)
{
cout << x << " "; // 输出:10 10 10 10 10
}
cout << endl;
system("pause");
return 0;
}
注意:
fill
适用于,当需要用相同的值填充整个容器时。fill_n
n
是填充的元素数量。示例:
#include
using namespace std;
#include
#include
int main() {
vector<int> vec(5, 0);
fill_n(vec.begin(), 3, 10); // 将前3个元素填充为10
for (int x : vec)
{
cout << x << " "; // 输出:10 10 10 0 0
}
cout << endl;
system("pause");
return 0;
}
注意:
fill_n
适用于,当需要填充容器的部分元素时。copy
n
是源范围中的元素数量。示例:
#include
using namespace std;
#include
#include
int main() {
vector<int> src = { 1, 2, 3, 4, 5 };
vector<int> dest(5);
// 将 src 中的元素复制到 dest 中
copy(src.begin(), src.end(), dest.begin());
cout << "复制的vector: ";
for (int val : dest)
{
cout << val << " ";
}
cout << endl;
system("pause");
return 0;
}
注意:
copy
用于将一个容器中的元素复制到另一个容器,或从一个容器复制到数组等。swap
示例:
#include
using namespace std;
#include
int main() {
int a = 5, b = 10;
// 交换 a 和 b 的值
swap(a, b);
cout << "a = " << a << ", b = " << b << endl;
system("pause");
return 0;
}
注意:
swap
适用于,当需要交换两个元素或两个容器的内容时。replace
n
是容器的元素数量。示例:
#include
using namespace std;
#include
#include
int main() {
vector<int> vec = { 1, 2, 3, 2, 5 };
replace(vec.begin(), vec.end(), 2, 10); // 将所有2替换为10
for (int x : vec)
{
cout << x << " "; // 输出:1 10 3 10 5
}
cout << endl;
system("pause");
return 0;
}
注意:
replace
适用于,当需要将容器中的指定值替换为其他值时。replace_if
n
是容器的元素数量。示例:
#include
using namespace std;
#include
#include
bool is_odd(int n)
{
return n % 2 != 0;
}
int main() {
vector<int> vec = { 1, 2, 3, 4, 5 };
replace_if(vec.begin(), vec.end(), is_odd, 10); // 将所有奇数替换为10
for (int x : vec)
{
cout << x << " "; // 输出:10 2 10 4 10
}
cout << endl;
system("pause");
return 0;
}
注意:
replace_if
适用于,当需要根据某种条件替换容器中元素时。transform
n
是容器的元素数量。示例:
#include
using namespace std;
#include
#include
int square(int n)
{
return n * n;
}
int main() {
vector<int> vec = { 1, 2, 3, 4, 5 };
vector<int> result(vec.size());
transform(vec.begin(), vec.end(), result.begin(), square);
for (int x : result)
{
cout << x << " "; // 输出:1 4 9 16 25
}
cout << endl;
system("pause");
return 0;
}
注意:
transform
适用于,当需要对容器中的每个元素进行某些变换时。rotate
n
是范围中的元素数量。示例:
#include
#include // std::rotate
#include
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 将 vec 中的元素旋转 2 次
std::rotate(vec.begin(), vec.begin() + 2, vec.end());
std::cout << "Rotated vector: ";
for (int val : vec) {
std::cout << val << " ";
}
std::cout << std::endl;
return 0;
}
注意:
rotate
适用于,当需要将容器中的元素旋转时。