美文网首页
C++SLT容器算法包常用函数

C++SLT容器算法包常用函数

作者: 大虾啊啊啊 | 来源:发表于2022-08-21 13:16 被阅读0次

0、导入包

#include <iostream>

#include <vector>
#include <stack>
#include <queue> // 队列支持(内部:基本上 链表 、 数组 )
#include <list> // list容器的支持
#include <set>
#include <map>
#include <algorithm> // 算法包
#include <unistd.h> // sleep(秒)

using namespace std;

1、for_each

遍历容器

//自定义仿函数
class _Function {
public:
    void operator()(int value) {
        cout << value << endl;
    }
};

int main() {
    set<int> sets;
    sets.insert(100);
    sets.insert(101);
    sets.insert(102);
    sets.insert(103);
    sets.insert(104);

    set<int> sets2;
    sets2.insert(200);
    sets2.insert(201);
    sets2.insert(202);
    sets2.insert(203);
    sets2.insert(204);

    //foreach
    for_each(sets.begin(), sets.end(), _Function());


    return 0;
}

100
101
102
103
104

2、transform

变化容器中的元素

class __unary_op {
public:
    int operator()(const int value) {
        return value + 2;// 修改每个元素
    }
};
int main() {
    vector<int> vectorVar;
    vectorVar.insert(vectorVar.begin(), 10000);
    vectorVar.insert(vectorVar.begin(), 20000);
    vectorVar.insert(vectorVar.begin(), 30000);
    vectorVar.insert(vectorVar.begin(), 40000);
    //设置容器大小
    vector<int> result;
    result.resize(vectorVar.size());
    transform(vectorVar.begin(), vectorVar.end(), result.begin(), __unary_op());
    for (auto it = result.begin(); it !=result.end() ; it++) {
        cout<<*it<<endl;
    }

    return 0;
}

40002
30002
20002
10002

3、find

查找

int main() {
    vector<int> vectorVar;
    vectorVar.insert(vectorVar.begin(), 10000);
    vectorVar.insert(vectorVar.begin(), 40000);
    vectorVar.insert(vectorVar.begin(), 30000);
    vectorVar.insert(vectorVar.begin(), 20000);
    //20000 30000 40000 10000
    //返回的是迭代器
    auto it = find(vectorVar.begin(), vectorVar.end(), 40000);
    if(it!=vectorVar.end()){
        cout<<"找到了"<<endl;
        for (auto i = it; i!=vectorVar.end() ; ++i) {
            cout<<*i<<endl;
        }
    }
    else{
        cout<<"没找到"<<endl;
    }

    return 0;
}

找到了
40000
10000

find函数返回的是迭代器,一旦找到指针就停止位移。因此指针会停在第一次找到的地方,因此找到的结果打印就是找到的地方的数据和后面的数据。

4、find_if

根据条件查找,上面的find函数内部其实是调用了find_if

int main() {
    vector<int> vectorVar;
    vectorVar.insert(vectorVar.begin(), 10000);
    vectorVar.insert(vectorVar.begin(), 40000);
    vectorVar.insert(vectorVar.begin(), 30000);
    vectorVar.insert(vectorVar.begin(), 20000);
    //20000 30000 40000 10000
    //寻找小于2000的
    //使用 bind2nd  函数适配器
      auto it = find_if(vectorVar.begin(), vectorVar.end(), bind2nd(less<int>(), 10002));
    if (it != vectorVar.end()) {
        cout << "找到了小于10002" << endl;
        for (auto i = it; i != vectorVar.end(); ++i) {
            cout << *i << endl;
        }
    } else {
        cout << "没找到" << endl;
    }
    return 0;
}

找到了小于10002
10000

5、cout和count_if

根据条件计算数量

int main() {
    vector<int> vectorVar;
    vectorVar.insert(vectorVar.begin(), 10000);
    vectorVar.insert(vectorVar.begin(), 40000);
    vectorVar.insert(vectorVar.begin(), 30000);
    vectorVar.insert(vectorVar.begin(), 20000);
    //20000 30000 40000 10000
    long size = count(vectorVar.begin(), vectorVar.end(), 10000);
    cout<<"等于10000的数量:"<<size<<endl;
    long size2 = count_if(vectorVar.begin(), vectorVar.end(), bind2nd(less<int>(),30000));
    cout<<"小于30000的数量:"<<size2<<endl;
    return 0;
}

等于10000的数量:1
小于30000的数量:2

6、merge

合并容器

int main() {
    vector<int> vectorVar;
    vectorVar.insert(vectorVar.begin(), 10000);
    vectorVar.insert(vectorVar.begin(), 40000);
    vectorVar.insert(vectorVar.begin(), 30000);
    vectorVar.insert(vectorVar.begin(), 20000);

    vector<int> vectorVar2;
    vectorVar2.insert(vectorVar2.begin(), 10002);
    vectorVar2.insert(vectorVar2.begin(), 40003);
    vectorVar2.insert(vectorVar2.begin(), 30004);
    vectorVar2.insert(vectorVar2.begin(), 20006);

    vector<int> vectorVarResult;
    vectorVarResult.resize(vectorVar.size()+vectorVar2.size());

    merge(vectorVar.begin(),vectorVar.end(),vectorVar2.begin(),vectorVar2.end(),vectorVarResult.begin());
    for (auto i = vectorVarResult.begin(); i!=vectorVarResult.end() ; ++i) {
        cout<<*i<<endl;
    }

    return 0;

20000
20006
30000
30004
40000
10000
40003
10002

7、sort排序

使用系统自定义排序+自定义仿函数排序

class my_less {
public:
    bool operator()(int x, int y) {
        return x < y;
    }
};

int main() {
    vector<int> vectorVar;
    vectorVar.insert(vectorVar.begin(), 10000);
    vectorVar.insert(vectorVar.begin(), 40000);
    vectorVar.insert(vectorVar.begin(), 30000);
    vectorVar.insert(vectorVar.begin(), 20000);
    //从大到小排序
    //使用系统仿函数(谓词)
    sort(vectorVar.begin(), vectorVar.end(), greater<int>());
    for (auto itVar = vectorVar.begin(); itVar != vectorVar.end(); itVar++) {
        cout << *itVar << endl;
    }
    cout << "-----------------------" << endl;
    //从小到大排序
    //自定义仿函数
    sort(vectorVar.begin(), vectorVar.end(), my_less());
    // 直接打印 vectorVar容器  此时 是不是就已经排序了
    for (auto itVar = vectorVar.begin(); itVar != vectorVar.end(); itVar++) {
        cout << *itVar << endl;
    }

    return 0;
}

40000
30000
20000
10000
-----------------------
10000
20000
30000
40000

8、copy

复制容器到另外一个容器

int main() {
    vector<int> vectorVar;
    vectorVar.insert(vectorVar.begin(), 10000);
    vectorVar.insert(vectorVar.begin(), 40000);
    vectorVar.insert(vectorVar.begin(), 30000);
    vectorVar.insert(vectorVar.begin(), 20000);
    vector<int> result;
    result.resize(vectorVar.size());
    copy(vectorVar.begin(), vectorVar.end(),result.begin());
    for (auto itVar = result.begin(); itVar != result.end(); itVar++) {
        cout <<"result:"<< *itVar << endl;
    }

    return 0;
}

result:20000
result:30000
result:40000
result:10000

9、replace

替换容器中的某个内容

int main() {
    vector<int> vectorVar;
    vectorVar.insert(vectorVar.begin(), 10000);
    vectorVar.insert(vectorVar.begin(), 40000);
    vectorVar.insert(vectorVar.begin(), 30000);
    vectorVar.insert(vectorVar.begin(), 20000);
    replace(vectorVar.begin(),vectorVar.end(),30000,5);
    for (auto itVar = vectorVar.begin(); itVar != vectorVar.end(); itVar++) {
        cout <<"result:"<< *itVar << endl;
    }

    return 0;
}
result:20000
result:5
result:40000
result:10000

相关文章

网友评论

      本文标题:C++SLT容器算法包常用函数

      本文链接:https://www.haomeiwen.com/subject/akevgrtx.html