【C++知识点】STL 常用算法总结(二)

简介: 【C++知识点】STL 常用算法总结(二)

拷贝和替换算法

copy

功能描述:容器内指定范围的元素拷贝到另一个容器中

函数原型:

//将开始迭代器到结束迭代器之间的元素拷贝到目标容器中
//beg 开始迭代器
//end 结束迭代器
//dest 目标开始迭代器
copy(iterator beg, iterator end, iterator dest);
replace

功能描述:将容器内指定范围的旧元素替换为新元素

函数原型:

//将区间内旧元素替换成新元素
//beg 开始迭代器
//end 结束迭代器
//oldvalue 旧元素
//newvalue 新元素
replace(iterator beg, iterator end, oldvalue, newvalue);

案例:

vector<int> v={10,20,10,30,10,40};
//将10替换成1000
replace(v.begin(), v.end(), 10, 1000);
replace_if

功能描述:将区间内满足条件的元素,替换成指定元素

函数原型:

//按条件替换元素,满足条件的替换成指定元素
//beg 开始迭代器
//end 结束迭代器
//_pred 谓词
//newvalue 替换的新元素
replace_if(iterator beg, iterator end, _pred, newvalue);

案例:

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
//常用拷贝和替换算法replace_if
class MyPrint
{
public:
    void operator()(int val)
    {
        cout << val << " ";
    }
};
class Greater20
{
public:
    bool operator()(int val)
    {
        return val > 20;
    }
};
void test01()
{
    vector<int> v={1,10,20,30,20,50,10};
    cout << "before replace " << endl;
    for_each(v.begin(), v.end(), MyPrint());
    cout << endl;
    //大于20替换成1000
    replace_if(v.begin(), v.end(), Greater20(), 1000);
    cout << "after replace " << endl;
    for_each(v.begin(), v.end(), MyPrint());
    cout << endl;
}
int main() 
{
    test01();
    return 0;
}
swap

功能描述:互换两个容器的元素

函数原型:

//互换两个容器的元素
//c1容器1
//c2容器2
swap(container c1, container c2);

算术生成算法

算术生成算法属于小型算法,使用时包含的头文件为#include<numeric>

accumulate

功能描述:计算区间内容器元素累计总和

函数原型:

//计算容器元素累计总和
//beg 开始迭代器
//end 结束迭代器
//value 起始值
accumulate(iterator beg, iterator end, value);

案例:

#include<iostream>
using namespace std;
#include<vector>
#include<numeric>
//常用算术生成算法
void test01()
{
    vector<int> v;
    for (int i = 0; i <= 100; i++)
    {
        v.push_back(i);
    }
    int total = accumulate(v.begin(), v.end(), 0);//参数3 起始累加值
    cout << " total = " << total << endl;
}
int main() 
{
    test01();
    return 0;
}
fill

功能描述:向容器中填充指定的元素

函数原型:

//向容器中填充元素
//beg 开始迭代器
//end 结束迭代器
//value 填充值
fill(iterator beg, iterator end, value);

案例:

vector<int> v;
v.resize(10);
fill(v.begin(), v.end(), 100);

集合算法

set_intersection

功能描述:求两个容器的交集

函数原型:

//求两个容器的交集
//注意:两个集合必须是有序序列,目标容器开辟空间需要从两个容器中取小值,set_intersection返回值即是交集中最后一个元素的位置
//beg1 容器1开始迭代器
//end1 容器1结束迭代器
//beg2 容器2开始迭代器
//end2 容器2结束迭代器
//dest 目标容器开始迭代器
set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);

案例:

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
//常用集合算法set_intersection
void myPrint(int val)
{
    cout << val << " ";
}
void test01(){
    vector<int> v1={1,2,3,4,5};
    vector<int> v2={1,3,6,9};
    vector<int> vTarget;
    //目标容器需要提前开辟空间
    //最特殊情况大容器包含小容器开辟空间取小容器的size即可
    vTarget.resize(min(v1.size(), v2.size()));
    //获取交集
    vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
    for_each(vTarget.begin(), itEnd, myPrint);
    cout << endl;
}
int main() {
    test01();
    return 0;
}
set_union

功能描述:求两个集合的并集

函数原型:

//求两个集合的并集
//注意:两个集合必须是有序序列
//beg1 容器1开始迭代器
//end1 容器1结束迭代器
//beg2 容器2开始迭代器
//end2 容器2结束迭代器
//dest 目标容器开始迭代器
set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);

案例:

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
//常用集合算法set_union
void myPrint(int val)
{
    cout << val << " ";
}
void test01(){
    vector<int> v1={1,2,3};
    vector<int> v2={4,5,6};
    vector<int> vTarget;
    //目标容器需要提前开辟空间
    //最特殊情况两个容器没有交集,并集就是两个容器size相加
    vTarget.resize(v1.size() + v2.size());
    //获取交集
    vector<int>::iterator itEnd = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
    for_each(vTarget.begin(), itEnd, myPrint);
    cout << endl;
}
int main() {
    test01();
    return 0;
}
set_difference

功能描述:求两个集合的差集

函数原型:

//求两个集合的差集
//注意:两个集合必须是有序序列
//beg1 容器1开始迭代器
//end1 容器1结束迭代器
//beg2 容器2开始迭代器
//end2 容器2结束迭代器
//dest 目标容器开始迭代器
set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);

案例:

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
//常用集合算法set_union
void myPrint(int val)
{
    cout << val << " ";
}
void test01(){
  vector<int> v1={1,2,3,4,5};
    vector<int> v2={2,4,5,6,8};
    vector<int> vTarget;
    //目标容器需要提前开辟空间
    //最特殊情况两个容器相交开辟空间取大容器的size即可
    vTarget.resize(max(v1.size(), v2.size()));
    cout << "v1 and v2's difference set is : " << endl;
    vector<int>::iterator itEnd =set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
    for_each(vTarget.begin(), itEnd, myPrint);
    cout << endl;
    cout << "v2 and v1's difference set is : " << endl;
    itEnd = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin());
    for_each(vTarget.begin(), itEnd, myPrint);
    cout << endl;
}
int main() {
    test01();
    return 0;
}
目录
相关文章
|
5天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
23 2
|
13天前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
11天前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
15天前
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
19 1
|
18天前
|
算法 安全 C++
用 C++ 算法控制员工上网的软件,关键逻辑是啥?来深度解读下
在企业信息化管理中,控制员工上网的软件成为保障网络秩序与提升办公效率的关键工具。该软件基于C++语言,融合红黑树、令牌桶和滑动窗口等算法,实现网址精准过滤、流量均衡分配及异常连接监测。通过高效的数据结构与算法设计,确保企业网络资源优化配置与安全防护升级,同时尊重员工权益,助力企业数字化发展。
38 4
|
28天前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
47 7
|
2月前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
82 4
|
1月前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
39 0
|
5天前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
43 18
|
5天前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
31 13