c++常见算法

news2024/9/22 11:27:34

目录

1、常见遍历算法

1.1、for_each遍历算法

1.2、、transform算法

 2、常见的查找算法

2.1、find 算法查找元素

2.1.1、find 算法查找基本类型

2.1.2、find 算法查找自定义类型

2.2、find_if 按照条件查找

2.3、adjacent_find算法 查找相邻重复元素

2.4、binary_search算法 二分查找法

2.5、count算法 统计元素出现次数

​编辑 

2.6、count_if算法 统计元素出现次数

3、常用的排序算法

3.1、merge算法 容器元素合并

3.2、sort算法 容器元素排序  

3.3、random_shuffle算法 对指定范围内的元素随机调整次序

​编辑

3.4、reverse算法 反转指定范围的元素

4、常见拷贝替换算法

4.1、copy算法

4.2、copy算法升级

4.3、replace算法  

​编辑

4.4、 replace_if算法

4.4.1、使用标准模板库中的内建函数对象

4.4.2、使用自定义函数对象(仿函数)

4.5、swap算法 

5、常见算数生成算法

5.1、accumulate算法 计算容器元素累计总和

5.2、fill算法 向容器中添加元素

6、常见的集合操作

6.1、set_intersection求两个set集合的交集

6. 2、 set_union算法 求两个set集合的并集

6.3、set_difference算法 求两个set集合的差集 

7、总结


1、常见遍历算法

1.1、for_each遍历算法

/*
2 遍历算法 遍历容器元素
3 @param beg 开始迭代器
4 @param end 结束迭代器
5 @param _callback 函数回调或者函数对象
6 @return 函数对象
7 */
for_each(iterator beg, iterator end, _callback);

其中 回调函数 _callback 可以使用  普通函数 或者 函数对象 实现

1.2、、transform算法

transform 算法 将指定容器区间元素 搬运到另一容器中
注意 : transform 不会给目标容器分配内存,所以需要我们提前分配好内存
/*
1 @param beg1 源容器开始迭代器
4 @param end1 源容器结束迭代器
5 @param beg2 目标容器开始迭代器
6 @param _cakkback 回调函数或者函数对象
7 @return 返回目标容器迭代器
8 */
transform(iterator beg1, iterator end1, iterator beg2, _callbakc);

其中 回调函数 _callback 可以使用  普通函数 或者 函数对象 实现

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void printVectorInt(vector<int> &v)
{
    vector<int>::iterator it;
    for(it=v.begin(); it!=v.end(); it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
}


//回调函数 使用 普通函数完成,也可以使用函数对象完成
//回调函数中对 数据 进行需要的处理
int myTransInt01(int val)
{
    return val;
}

void test01()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(70);
    v1.push_back(30);
    v1.push_back(50);
    v1.push_back(90);


    vector<int> v2;
    v2.resize(v1.size());
    transform(v1.begin(), v1.end(), v2.begin(), myTransInt01);
    printVectorInt(v2);
}


int main(int argc, char *argv[])
{
    test01();
    return 0;
}

 2、常见的查找算法

2.1、find 算法查找元素


/*
2 find算法 查找元素
3 @param beg 容器开始迭代器
4 @param end 容器结束迭代器
5 @param value 查找的元素
6 @return 返回查找元素的位置
7 */
find(iterator beg, iterator end, value);

2.1.1、find 算法查找基本类型


void test02()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(70);
    v1.push_back(30);
    v1.push_back(50);
    v1.push_back(90);

    vector<int>::iterator ret;
    ret = find(v1.begin(), v1.end(), 30);
    if(ret != v1.end())
    {
        cout<<"查找的数据:"<<*ret<<endl;
    }
}

int main(int argc, char *argv[])
{
    test02();
    return 0;
}

2.1.2、find 算法查找自定义类型

find 查找自定义数据类型  需要重载==

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

#include<string>
class Person
{
    friend void test03();
private:
    int num;
    string name;
public:
    Person(){}
    Person(int num, string name){
        this->num = num;
        this->name = name;
    }
    bool operator==(const Person &ob)
    {
        return ((this->num == ob.num) && (this->name == ob.name));
    }
};

void test03()
{
    vector<Person> v1;
    v1.push_back(Person(100,"lucy"));
    v1.push_back(Person(101,"bob"));
    v1.push_back(Person(102,"tom"));

    vector<Person>::iterator ret;
    //find 查找自定义数据类型  需要重载==
    ret = find(v1.begin(), v1.end(), Person(101,"bob"));
    if(ret != v1.end())
    {
        cout<<"查找的数据:"<<(*ret).num<<" "<<(*ret).name<<endl;
    }
}

int main(int argc, char *argv[])
{
    test03();
    return 0;
}

如果没有重载 相等(==)运算符,则编译会报错

 也即是 find 函数查找自定义类型数据的时候,是从开始迭代器到末尾迭代器中依次将容器中的元素从头到尾取出来,然后和当前需要查找的元素一一对比,但是由于是自定义类型的数据,所以必须要重 相等(==)运算符,否则编译会报错

bool operator==(const Person &ob)
    {
        return ((this->num == ob.num) && (this->name == ob.name));
    }

2.2、find_if 按照条件查找

/*
2 @param beg 容器开始迭代器
3 @param end 容器结束迭代器
4 @param callback 回调函数或者谓词(返回bool类型的函数对象)
5 @return bool 查找返回true 否则false
6 */
find_if(iterator beg, iterator end, _callback);

从容器中查找出大于 30 的元素

oid test04()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(70);
    v1.push_back(30);
    v1.push_back(50);
    v1.push_back(90);

    vector<int>::iterator ret;
    ret = find_if(v1.begin(), v1.end(),  bind2nd(greater<int>(),30)  );
    if(ret != v1.end())
    {
        cout<<"查找的数据:"<<*ret<<endl;
    }
}

int main(int argc, char *argv[])
{
    test04();
    return 0;
}

2.3、adjacent_find算法 查找相邻重复元素


void test05()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(30);
    vector<int>::iterator ret;

    ret = adjacent_find(v1.begin(),v1.end());
    if(ret != v1.end())
    {
        cout<<"第一个相邻重复的元素:"<<*ret<<endl;
    }
}

int main(int argc, char *argv[])
{
    test05();
    return 0;
}

2.4、binary_search算法 二分查找法

binary_search 查找的结果和前面的查找算法的返回值不一样,前面的查找算法是迭代器,但是binary_search 查找的结果是 bool 类型

1 /*
2 注意: 在无序序列中不可用
3 @param beg 容器开始迭代器
4 @param end 容器结束迭代器
5 @param value 查找的元素
6 @return bool 查找返回true 否则false
7 */
bool binary_search(iterator beg, iterator end, value);
void test06()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(70);
    v1.push_back(30);
    v1.push_back(50);
    v1.push_back(90);
    sort(v1.begin(), v1.end());

    bool ret;
    ret = binary_search(v1.begin(), v1.end(),  30);
    if(ret)
    {
        cout<<"存在该数据"<<endl;
    }
}

2.5、count算法 统计元素出现次数

/*
2 @param beg 容器开始迭代器
3 @param end 容器结束迭代器
4 @param value
5 @return int返回元素个数
6 */
count(iterator beg, iterator end, value);

void test07()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(30);
    v1.push_back(70);
    v1.push_back(30);
    v1.push_back(90);

    cout<<count(v1.begin(), v1.end(), 30)<<endl;
}

int main(int argc, char *argv[])
{
    test07();
    return 0;
}

2.6、count_if算法 统计元素出现次数

/*
2 @count_if算法 统计元素出现次数
3 @param beg 容器开始迭代器
4 @param end 容器结束迭代器
5 @param callback 回调函数或者谓词(返回bool类型的函数对象)
6 @return int返回元素个数
7 */
count_if(iterator beg, iterator end, _callback);

void test08()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(30);
    v1.push_back(70);
    v1.push_back(30);
    v1.push_back(90);

    cout<<count_if(v1.begin(), v1.end(), bind2nd(greater<int>(), 10) )<<endl;
}

int main(int argc, char *argv[])
{
    test08();
    return 0;
}

3、常用的排序算法

3.1、merge算法 容器元素合并

merge 算法 容器元素合并,并存储到另一容器中
注意 : 两个容器必须是有序的
/*
2 merge算法 容器元素合并,并存储到另一容器中
3 注意:两个容器必须是有序的
4 @param beg1 容器1开始迭代器
5 @param end1 容器1结束迭代器
6 @param beg2 容器2开始迭代器
7 @param end2 容器2结束迭代器
8 @param dest 目标容器开始迭代器
9 */
merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterat
or dest)
void test10()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(30);
    v1.push_back(50);

    vector<int> v2;
    v2.push_back(20);
    v2.push_back(40);
    v2.push_back(60);
    v2.push_back(70);
    v2.push_back(80);

    vector<int> v3;
    v3.resize(v1.size() + v2.size());
    merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
    printVectorInt(v3);
}

int main(int argc, char *argv[])
{
    test10();
    return 0;
}

3.2、sort算法 容器元素排序  

/*
2 sort算法 容器元素排序
3 @param beg 容器1开始迭代器
4 @param end 容器1结束迭代器
5 @param _callback 回调函数或者谓词(返回bool类型的函数对象)
6 */
sort(iterator beg, iterator end, _callback)

3.3、random_shuffle算法 对指定范围内的元素随机调整次序

/*
2 random_shuffle算法 对指定范围内的元素随机调整次序
3 @param beg 容器开始迭代器
4 @param end 容器结束迭代器
5 */
random_shuffle(iterator beg, iterator end)

通过随机数种子调整元素顺序

#include<stdlib.h>
#include<time.h>
void test11()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(30);
    v1.push_back(50);
    v1.push_back(70);
    v1.push_back(90);
    printVectorInt(v1);
    //设置随机数种子
    srand(time(NULL));
    //洗牌
    random_shuffle(v1.begin(), v1.end());
    printVectorInt(v1);
}

3.4、reverse算法 反转指定范围的元素

不管容器中的元素有没有顺序,都可以反转

/*
2 reverse算法 反转指定范围的元素
3 @param beg 容器开始迭代器
4 @param end 容器结束迭代器
5 */
reverse(iterator beg, iterator end)

void test12()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(30);
    v1.push_back(50);
    v1.push_back(70);
    v1.push_back(90);
    printVectorInt(v1);
    //洗牌
    reverse(v1.begin(), v1.end());
    printVectorInt(v1);
}

int main(int argc, char *argv[])
{
    test12();
    return 0;
}

4、常见拷贝替换算法

4.1、copy算法

copy 算法 将容器内指定范围的元素拷贝到另一容器中

/*
2 copy算法 将容器内指定范围的元素拷贝到另一容器中
3 @param beg 容器开始迭代器
4 @param end 容器结束迭代器
5 @param dest 目标起始迭代器
6 */
copy(iterator beg, iterator end, iterator dest)
void test13()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(30);
    v1.push_back(50);
    v1.push_back(70);
    v1.push_back(90);
    vector<int> v2;
    v2.resize(v1.size());

    copy(v1.begin(), v1.end(), v2.begin());
    printVectorInt(v2);
}

int main(int argc, char *argv[])
{
    test13();
    return 0;
}

4.2、copy算法升级

#include<iterator>
void test14()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(30);
    v1.push_back(50);
    v1.push_back(70);
    v1.push_back(90);
     
    //第二个迭代器可以是控制台 ostream_iterator<int>(cout, " ") 
    copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " ") );
    cout<<endl;
}

int main(int argc, char *argv[])
{
    test14();
    return 0;
}

4.3、replace算法  

replace 算法 将容器内指定范围的旧元素修改为新元素
/*
2 replace算法 将容器内指定范围的旧元素修改为新元素
3 @param beg 容器开始迭代器
4 @param end 容器结束迭代器
5 @param oldvalue 旧元素
6 @param oldvalue 新元素
*/
replace(iterator beg, iterator end, oldvalue, newvalue)
void test15()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(30);
    v1.push_back(50);
    v1.push_back(70);
    v1.push_back(90);

    copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " ") );
    cout<<endl;

    replace(v1.begin(), v1.end(), 30, 3000);

    copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " ") );
    cout<<endl;
}


int main(int argc, char *argv[])
{
    test15();
  
}  

4.4、 replace_if算法

replace_if算法 将容器内指定范围满足条件的元素替换为新元素

/*
2 replace_if算法 将容器内指定范围满足条件的元素替换为新元素
3 @param beg 容器开始迭代器
4 @param end 容器结束迭代器
5 @param callback函数回调或者谓词(返回Bool类型的函数对象)
6 @param oldvalue 新元素
7 */
replace_if(iterator beg, iterator end, _callback, newvalue)

4.4.1、使用标准模板库中的内建函数对象

void test16()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(30);
    v1.push_back(50);
    v1.push_back(70);
    v1.push_back(90);

    copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " ") );
    cout<<endl;

    replace_if(v1.begin(), v1.end(), bind2nd(greater<int>(),30), 3000);

    copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " ") );
    cout<<endl;
}

4.4.2、使用自定义函数对象(仿函数)

class GreaterThan30
{
public:
    bool operator()(int value)
    {
        return value>30;
    }
};

void test16()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(30);
    v1.push_back(50);
    v1.push_back(70);
    v1.push_back(90);

    copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " ") );
    cout<<endl;

    replace_if(v1.begin(), v1.end(), GreaterThan30() , 3000);

    copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " ") );
    cout<<endl;
}

int main(int argc, char *argv[])
{
    test16();
    return 0;
}

4.5、swap算法 

不用关心两个容器的大小

swap算法 互换两个容器的元素

/*
3 @param c1容器1
4 @param c2容器2
5 */
swap(container c1, container c2)

5、常见算数生成算法

5.1、accumulate算法 计算容器元素累计总和

accumulate算法 计算容器元素累计总和

/*
3 @param beg 容器开始迭代器
4 @param end 容器结束迭代器
5 @param value累加值 (注意:求和完后 + value)
6 */
accumulate(iterator beg, iterator end, value)

5.2、fill算法 向容器中添加元素

fill算法 向容器中添加元素

/*
3 @param beg 容器开始迭代器
4 @param end 容器结束迭代器
5 @param value t填充元素
6 */
fill(iterator beg, iterator end, value)
void test17()
{
   vector<int> v1;
   v1.resize(5);

   fill(v1.begin(), v1.end(), 10);

   copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " ") );
   cout<<endl;
}

int main(){
    test17();
}

6、常见的集合操作

6.1、set_intersection求两个set集合的交集

set_intersection算法 求两个set集合的交集
注意:两个集合必须是有序序列

/*
4 @param beg1 容器1开始迭代器
5 @param end1 容器1结束迭代器
6 @param beg2 容器2开始迭代器
7 @param end2 容器2结束迭代器
8 @param dest 目标容器开始迭代器
9 @return 目标容器的最后一个元素的迭代器地址
10 */
set_intersection(iterator beg1, iterator end1, iterator beg2, iterator e
nd2,iterator dest)
void test18()
{
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(3);
    v1.push_back(5);
    v1.push_back(7);
    v1.push_back(9);

    vector<int> v2;
    v2.push_back(7);
    v2.push_back(9);
    v2.push_back(11);
    v2.push_back(13);
    v2.push_back(15);

    vector<int> v3;    //存放交集
    v3.resize( min(v1.size(),v2.size()));

    vector<int>::iterator ret;
    ret = set_intersection(v1.begin(), v1.end(), v2.begin(),v2.end(), v3.begin());
    copy(v3.begin(), ret, ostream_iterator<int>(cout, " ") );
    cout<<endl;
}

int main(){
    test18();
    return 0;
}

6. 2、 set_union算法 求两个set集合的并集

set_union算法 求两个set集合的并集
注意:两个集合必须是有序序列

 /*
4 @param beg1 容器1开始迭代器
5 @param end1 容器1结束迭代器
6 @param beg2 容器2开始迭代器
7 @param end2 容器2结束迭代器
8 @param dest 目标容器开始迭代器
9 @return 目标容器的最后一个元素的迭代器地址
10 */
set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, it
erator dest)
void test18()
{
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(3);
    v1.push_back(5);
    v1.push_back(7);
    v1.push_back(9);

    vector<int> v2;
    v2.push_back(7);
    v2.push_back(9);
    v2.push_back(11);
    v2.push_back(13);
    v2.push_back(15);

    vector<int> v3;    //存放并集
    v3.resize(v1.size()+v2.size());

    vector<int>::iterator ret;
    ret = set_union(v1.begin(), v1.end(), v2.begin(),v2.end(), v3.begin());
    copy(v3.begin(), ret, ostream_iterator<int>(cout, " ") );
    cout<<endl;
}

int main(){
    test18();
    return 0;
}

6.3、set_difference算法 求两个set集合的差集 

set_difference算法 求两个set集合的差集
注意:两个集合必须是有序序列

 /*
4 @param beg1 容器1开始迭代器
5 @param end1 容器1结束迭代器
6 @param beg2 容器2开始迭代器
7 @param end2 容器2结束迭代器
8 @param dest 目标容器开始迭代器
9 @return 目标容器的最后一个元素的迭代器地址
10 */
set_difference(iterator beg1, iterator end1, iterator beg2, iterator end
2, iterator dest)
void test18()
{
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(3);
    v1.push_back(5);
    v1.push_back(7);
    v1.push_back(9);

    vector<int> v2;
    v2.push_back(7);
    v2.push_back(9);
    v2.push_back(11);
    v2.push_back(13);
    v2.push_back(15);

    vector<int> v3;    //存放差集
    v3.resize(v1.size());  //A - B ,则最大为 v1的容器大小

    vector<int>::iterator ret;
    ret = set_difference(v1.begin(), v1.end(), v2.begin(),v2.end(), v3.begin());
    copy(v3.begin(), ret, ostream_iterator<int>(cout, " ") );
    cout<<endl;
}

int main(){
    test18();
    return 0;
}

7、总结

(1)、以后在 STL 中见到算法中的参数 _callback 可以使用  普通函数 或者 函数对象 实现

(2)、必须要注意 每一个 算法 的返回值的 类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/440163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaSE-Map

Map集合 5.0 重点掌握 能够说出Map集合的特点能够使Map集合添加方法保存数据使用“键找值””键值对“的方式遍历Map集合使用HashMap存储自定义键值对的数据完成HashMap案例 5.1 Map集合概述 现实生活中&#xff0c;经常会出现这么一种集合&#xff1a;如 身份证与个人&…

web自动化测试入门篇06 —— 元素定位进阶技巧

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

camunda的manual task节点用途

Camunda的Manual Task用于在流程中暂停执行&#xff0c;直到人工干预完成某个任务。与User Task不同&#xff0c;Manual Task没有分配给特定用户或用户组&#xff0c;而是需要手动启动并指定下一步流程。 Manual Task可以用于以下场景&#xff1a; 1、流程执行需要等待人工干…

13-nginx

一 初始Nginx 1 Nginx概述 Nginx是一款轻量级的Web服务器、反向代理服务器&#xff0c;由于它的内存占用少&#xff0c;启动极快&#xff0c;高并发能力强&#xff0c;在互联网项目中广泛应用。Nginx 专为性能优化而开发&#xff0c;使用异步非阻塞事件驱动模型。 常见服务器 …

MySQL基础——约束

前言 MySQL在我们工作中都会用到&#xff0c;那么我们最常接触的就是增删改查&#xff0c;而对于增删改查来说&#xff0c;我们更多的是查询。但是面试中&#xff0c;面试官又不会问你什么查询是怎么写的&#xff0c;都是问一些索引啊&#xff0c;事务啊&#xff0c; 底层结构…

搞懂 API:XML 和 Json的差异到底有多大

XML和JSON是两种常见的数据格式&#xff0c;它们在现代网络应用中起着重要的作用。本文将介绍XML和JSON的基础知识&#xff0c;并比较它们之间的差异。 XML XML&#xff0c;即可扩展标记语言&#xff08;eXtensible Markup Language&#xff09;&#xff0c;是一种用于描述数…

部署个人博客系统

目录 1.安装jdk 2.安装tomcat 3.数据库 4.部署博客系统 1.建库建表 2.微调代码 3.打包 4.拷贝 5.访问博客系统 为了能将我们写的项目部署到云服务器上 首先需要将部署时所依赖的环境搭建好 需要安装jdk,tomcat,mysql 1.安装jdk 直接使用包管理器进行安装,基于yum安装…

深入拆解 Java 虚拟机-打卡|开篇词 | 为什么我们要学习Java虚拟机?

文章目录 计划缘起跟郑老师学习学习JVM的好处 计划 缘起 JVM对我来说是高深莫测的东西&#xff0c;从事软件开发有些年头了&#xff0c;很难深入的去学习它&#xff0c;一来是工作中没有亟需用到这些&#xff0c;都是写一些业务代码&#xff0c;二来是觉得困难没有坚持下去&a…

每天一道大厂SQL题【Day22】华泰证券真题实战(四)

每天一道大厂SQL题【Day22】华泰证券真题实战(四) 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&…

【Java-Java集合】Java集合详解与区别

【Java-Java集合】Java集合详解与区别 1&#xff09;概述2&#xff09;集合框架图2.1.总框架图2.2.Iterable 框架图2.3.Map 框架图 3&#xff09;List3.1.ArrayList 类继承图3.2.LinkedList 类继承图 4&#xff09;Set4.1.HashSet 类继承图4.2.LinkedHashSet 类继承图4.3.TreeS…

C/C++开发中使用pkg-config来引用依赖库

在使用C/C进行开发的过程中&#xff0c;经常需要引用其它的库&#xff0c;可能是系统已经安装好的&#xff0c;也可能是其它的外部库。 如果是系统支持的库&#xff0c;可能在不同的系统下&#xff0c;其路径也不相同&#xff0c;在项目开发的时候跨平台将会是一个问题。比如&…

从零开始云服务器网卡抓包

从零开始云服务器网卡抓包 一. 服务器上新增自己的用户二. 添加组件libpcap四. 安装测试环境六. 编写demo代码七. 正式项目代码编译八. 结果展示 一. 服务器上新增自己的用户 我这边是ubuntu服务器&#xff0c;其默认username为ubuntu&#xff0c;使用创建服务器时候的密码通过…

10.基于共享储能电站的工业用户日前优化经济调度(论文复现)

matlab代码&#xff1a;基于共享储能电站的工业用户日前优化经济调度 相关程序代码资源&#xff1a;风、光、负荷场景生成&#xff1b;风电出力各场景及概率&#xff1b;光伏出力各场景及概率&#xff1b;负荷各场景及概率&#xff1b;场景的削减&#xff1b;样本概率初始化&a…

【云原生进阶之容器】第六章容器网络6.5.1--Calico网络方案综述

《云原生进阶之容器》专题索引: 第一章Docker核心技术1.1节——Docker综述第一章Docker核心技术1.2节——Linux容器LXC第一章Docker核心技术1.3节——命名空间Namespace第一章Docker核心技术1.4节——chroot技术第一章Docker核心技术1.5.1节——cgroup综述

Spring Web容器响应异常排查_Poller线程异常退出

问题一_系统响应异常 问题现象 04-11 18点左右客户反馈系统很慢&#xff1b;18点多&#xff0c;反馈pda登录异常&#xff1b; 19:20左右&#xff0c;本地网页登录&#xff0c;某些请求超时&#xff1b;某些正常&#xff1b; 短时间定位后无头绪&#xff0c;保留了stack和dum…

球友的一个帖子,半夜三点给我整睡不着了……

文章目录 一、起因二、建议1、括号和缩进2、仔细审题3、独立思考4、早起的好办法5、chatgpt会代替人类吗&#xff1f; 三、解决1、数据结构2、初始化3、判定 一、起因 事情的起因源自于星球里面一位球友的帖子&#xff0c;本来三点醒来上完厕所打算继续睡&#xff0c;突然手机响…

无人机应急救援有保障吗?如何实现救援?

无人机应急救援有保障吗?如何实现救援?中国自然灾害种类较多&#xff0c;分布地域广&#xff0c;发生频率较高。当遭遇洪水、火灾、洪水、地震、暴雪等灾害事故时&#xff0c;常规的信息通信基础设施受到损伤&#xff0c;导致信号中断。如果灾害事故地点相对偏僻&#xff0c;…

淄博旅游“一夜爆火”,五一流量大盘已经开启

全民调休换来的五一小长假即将来临&#xff0c;经过几年“禁锢”后&#xff0c;这两年的旅游业开始回暖。 而今年国内旅游黑马竟指向了新人淄博。 山东淄博烧烤一直以来都“小有名气”&#xff0c;但是这只在周边城市&#xff0c;或者部分人群里传播&#xff0c;而在今年&…

来使用分支语句和循环语句实现一个小游戏吧(猜数字游戏)

猜数字游戏 1.代码展示2.菜单设计3.主函数部分3.随机数设计 1.代码展示 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <time.h>void menu() {printf("************************\n");printf("*** 1.p…

移动端导航设计

根据产品层级的深度和广度&#xff0c;选择适合的导航模式&#xff0c;是产品设计中的关键一环。 任何APP的组织信息都需要以某种导航框架固定起来&#xff0c;一个新的产品合适的导航框架&#xff0c;决定了产品之后的延伸和扩展。 移动端的屏幕尺寸就这么大&#xff0c;操作方…