C++ CLT中的容器以及仿函数和谓词~

198 阅读3分钟

C++ CLT中的容器以及简单谓词~

vector容器

#include <vector> //必要导包
//TODO vector 容器
    vector<int> vector1;
    vector<int> vector2(10);//指定 10 个大小空间
    vector<int> vector3(10, 2);//指定 10 个大小空间每个值都是 2

    vector1.insert(vector1.begin(), 23);
    vector1.insert(vector1.begin(), 52);
    vector1.insert(vector1.begin(), 13);
    vector1.insert(vector1.begin(), 12);
    vector1.insert(vector1.end(), 142);

    //更改第一个位置得值
    vector1.front() = 111;
    cout << "vector 第一个值为:" << vector1.front() << endl;
    //更改最后一个位置得值
    vector1.back() = 22;
    cout << "vector 最后一个值为:" << vector1.back() << endl;
  
    for (int i = 0; i < vector1.size(); ++i) {
        cout << "vector 当前 item值为:" << vector1[i] << endl;
    }

运行结果为:

vector 第一个值为:111
vector 最后一个值为:22
vector 当前 item值为:111
vector 当前 item值为:13
vector 当前 item值为:52
vector 当前 item值为:23
vector 当前 item值为:22
  • vector1.begin() 插入到开始的位置
  • vector1.end() 插入到后面的位置
  • vector1.front() 第一个值(可以更改)
  • vector1.back() 最后一个值(可以更改)
  • vector1.insert(位置,值) 存放元素

栈(stack) 容器

	stack<int> stack;
    stack.push(23);
    stack.push(22);
    stack.push(51);
    stack.push(12);
    stack.push(92);

    //判断栈内是否有元素存在
    while (!stack.empty()) {
        //输出第一个栈内元素
        auto stackint = stack.top();
        cout << "stack 栈内元素为:" << stackint << endl;
        //弹栈
        stack.pop();
        //注意:弹栈之后栈内元素被释放
    }

运行结果为:

stack 栈内元素为:92
stack 栈内元素为:12
stack 栈内元素为:51
stack 栈内元素为:22
stack 栈内元素为:23

队列(queue) 容器

queue<int> queue;
    queue.push(42);
    queue.push(12);
    queue.push(22);
    queue.push(51);
    queue.push(56);
  
    while (!queue.empty()) {
        //获取第一个元素
        auto queueint = queue.front();
        cout << "queue 当前元素为:" << queueint << endl;
        queue.pop();
    }

运行结果为:

queue 当前元素为:42
queue 当前元素为:12
queue 当前元素为:22
queue 当前元素为:51
queue 当前元素为:56

使用和 vector方法类似:

  • queue.front(); 第一个元素
  • queue.back(); 最后一个元素
  • queue.pop(); 消费元素

优先级队列(priority_queue)

优先级队列内部封装了 vector
默认写法:(默认是从大到小排序):

	priority_queue<int> priorityQueue;
	 
	priorityQueue.push(42);
    priorityQueue.push(24);
    priorityQueue.push(12);
    priorityQueue.push(522);
    priorityQueue.push(6);
    
    while (!priorityQueue.empty()) {
        auto priorityQueueint = priorityQueue.top();
        cout << "priority_queue优先级队列元素为:" << priorityQueueint << endl;
        priorityQueue.pop();
        //和前边的一样,消费了就没了
    }

结果:

priority_queue优先级队列元素为:522
priority_queue优先级队列元素为:42
priority_queue优先级队列元素为:24
priority_queue优先级队列元素为:12
priority_queue优先级队列元素为:6

隐式代码:

priority_queue<int> priorityQueue;  == priority_queue<int, vector<int>, less<>> priorityQueue;

从小到大排序:

priority_queue<int, vector<int>, greater<>> priorityQueue;//从小到大排列(注意第三个参数!)

    priorityQueue.push(42);
    priorityQueue.push(24);
    priorityQueue.push(12);
    priorityQueue.push(522);
    priorityQueue.push(6);
    while (!priorityQueue.empty()) {
        auto priorityQueueint = priorityQueue.top();
        cout << "priority_queue优先级队列元素为:" << priorityQueueint << endl;
        priorityQueue.pop();
        //和前边的一样,消费了就没了
    }

运行结果:

priority_queue优先级队列元素为:6
priority_queue优先级队列元素为:12
priority_queue优先级队列元素为:24
priority_queue优先级队列元素为:42
priority_queue优先级队列元素为:522

list 容器

	list<int> list;
    //插入到最前面
    list.insert(list.begin(), 12);
    list.insert(list.begin(), 22);
    list.insert(list.begin(), 5);
    list.insert(list.begin(), 122);
    list.insert(list.begin(), 54);
    //插入到最后面
    list.insert(list.end(), 54);

    list.front() = 11;
    cout << "list 第一个元素为:" << list.front() << endl;
    list.back() = 11;
    cout << "list 最后一个元素为:" << list.back() << endl;

    /**
     *  list.begin() 获取第一个元素
     *  list.end()  最后一个元素
     *  auto = std::list<int>::iterator
     */
    for (std::list<int>::iterator it = list.begin(); it != list.end(); it++) {
        cout << "list 容器元素为:" << *it << endl;
    }

    //删除第一个元素
    list.erase(list.begin());
    for (std::list<int>::iterator it = list.begin(); it != list.end(); it++) {
        cout << "list 删除后元素为:" << *it << endl;
    }

运行结果:

list 第一个元素为:11
list 最后一个元素为:11
list 容器元素为:11
list 容器元素为:122
list 容器元素为:5
list 容器元素为:22
list 容器元素为:12
list 容器元素为:11
list 删除后元素为:122
list 删除后元素为:5
list 删除后元素为:22
list 删除后元素为:12
list 删除后元素为:11

用法和 vector 都类似

set 容器

采用红黑树的模式,会对你存入的数据排序,但是不允许数据相同

也可以从大到小或从小到大排序;

//默认
//    set<int ,less<int>> set;//从小到大排序
    set<int ,greater<int>> set1;//从大到小排序
    set1.insert(set1.begin(),123);
    set1.insert(set1.begin(),1);
    set1.insert(set1.begin(),42);
    set1.insert(set1.begin(),21);
    set1.insert(set1.end(),21);
    for (auto it = set1.begin(); it!= set1.end(); it++) {
        cout << "set 元素为:" << *it << endl;
    }
    //set 容器插入元素

    //和 kotlin 和 C++中的 pair 一样
    //auto = pair<set<int , less<int>>::iterator , bool>
    //charu.first  返回的是第一个元素(iterator)
    //charu.second 返回的是第二个元素(bool)
    auto charu = set1.insert(51);//这里元素不能插入相同的!!!

    //charu.second判断容器中是否有插入的元素
    if (charu.second){
        cout << "set 容器插入成功" << endl;
    }else{
        cout << "set 容器插入失败" << endl;
    }

运行结果:

set 元素为:123
set 元素为:42
set 元素为:21
set 元素为:1
set 容器插入成功

仿函数

在类中,重载()的函数叫仿函数

仿函数例子:

#include <algorithm>//for_each 算法包

class ShowForEach {
public:
    void operator()(string pInt) {
        cout << "for_each方式二元素为:" << pInt << endl;
    }
};

	set<string, less<string>> set1;
    set1.insert(set1.begin(), "set元素 1");
    set1.insert(set1.begin(), "set元素 2");
    set1.insert(set1.begin(), "set元素 3");
    set1.insert(set1.begin(), "set元素 4");
    set1.insert(set1.begin(), "set元素 5");

for_each(set1.begin(), set1.end(), ShowForEach());

注意:这里的for_each()调用的是系统算法包中的函数,下一章:C++ 算法包有讲

运行结果为:

for_each方式二元素为:set元素 1
for_each方式二元素为:set元素 2
for_each方式二元素为:set元素 3
for_each方式二元素为:set元素 4
for_each方式二元素为:set元素 5

谓词

什么是谓词:

从上面的容器中可以看出,上面比较的都是 int 类型(基本类型),谓词是用来比较对象的,返回 bool 类型的仿函数叫谓词

参数有几个就成为几元谓词,例如有 2 个参数;成为 二元谓词

系统谓词:

 set<int ,greater<int>> set1;//从大到小排序

set 集合中,第二个参数就是谓词,其他几个都一样

谓词的格式:

struct 结构体别名 {
    bool operator()(参数列表) {
        return ;
    }
};

自定义谓词:

#include <iostream>
#include <set>

using namespace std;

class Student {
public:
    string name;
    int id;
    Student(string name, int id) : name(name), id(id) {}
};


struct sort1 {
    //TODO 自定义谓词 从小到大排序
    bool operator()(const Student &student1, const Student &student2) {
        return student1.id < student2.id;
    }
};

struct sort2 {
    //TODO 自定义谓词 从大到小排序
    bool operator()(const Student &student1, const Student &student2) {
        return student1.id > student2.id;
    }
};

int main() {
    //TODO 谓词
    //上面的容器都是比较基本类型 谓词是用来自定义容器来比较对象的!
//    set<Student,less<Student>,bool> setVar1;
//    set<Student,less<Student>> setVar2;
//    set<Student> setVar3;

    //自定义谓词
    set<Student, sort1> setVar4;//(从小到大排序)
//    set<Student, sort2> setVar4;(从大到小排序)

    Student st1("张三1", 122);
    Student st2("张三2", 12);
    Student st3("张三3", 32);
    Student st4("张三4", 242);
    Student st5("张三5", 3);

    setVar4.insert(st1);
    setVar4.insert(st2);
    setVar4.insert(st3);
    setVar4.insert(st4);
    setVar4.insert(st5);

    for (auto it = setVar4.begin(); it != setVar4.end(); it++) {
        std::cout << it->id << "\t" << it->name << endl;
    }
    return 0;
}

map

	#include <map>//map容器必要导包


	map<int, string> map1;
	//map 存放元素方式一
    map1.insert(map1.begin(), pair<int, string>(1, "map 元素1"));
    map1.insert(map1.begin(), pair<int, string>(2, "map 元素2"));
    map1.insert(map1.begin(), pair<int, string>(3, "map 元素3"));

	//map 存放元素方式二
    map1[4] = "map 元素4";
    map1[4] = "覆盖元素 4";

    for (map<int, string>::iterator it = map1.begin(); it != map1.end(); it++) {
        std::cout << it->second << endl;
    }

map容器特点:
map 容器是通过 key,value 存放元素的,如果 key 相同,那么就会覆盖掉上一个元素!

运行结果:

map 元素1
map 元素2
map 元素3
覆盖元素 4

multimap

multimap<int ,string> multimap1;
    multimap1.insert(multimap1.begin(),pair<int,string>(1,"multimap1"));
    multimap1.insert(multimap1.begin(),pair<int,string>(1,"multimap2"));
    multimap1.insert(multimap1.begin(),pair<int,string>(1,"multimap4"));
    multimap1.insert(multimap1.begin(),pair<int,string>(1,"multimap5"));
    multimap1.insert(multimap1.begin(),pair<int,string>(1,"multimap3"));

//    multimap1[2] = "multimap6";
    for (multimap<int, string>::iterator it = multimap1.begin(); it != multimap1.end(); it++) {
        std::cout << it->second << endl;
    }

multimap特点:
和 map 相反,不会因为 key 相同而覆盖掉相同的值

运行结果:

multimap3
multimap5
multimap4
multimap2
multimap1

下一篇:C++ 算法包(find/find_if,for_each,transform,count/count_if,merge,sort,copy,replace)简单使用

原创不易,您的点赞就是对我最大的支持~