美文网首页
2-ndk学习之c++基础篇(04)

2-ndk学习之c++基础篇(04)

作者: ftd黑马 | 来源:发表于2020-02-20 18:06 被阅读0次

    容器

    c++中的容器分为两种:
    1.序列化容器,元素的排序关系,和元素本身没有任何关系,是我们在添加的时候的顺序导致的排序(vector,priority_queue)
    2.关联式容器,根据标识决定添加或者获取,,,类似于java中的map,set

    序列化容器之vector的基本用法

    首先要添加头文件
    #include <vector>//c++容器中提供的
    #include <string>//务必添加,否则下面用到string的地方都会报错
    
    //3种声明方式
    //    vector<int> vector01(1);//声明一个元素的空间
    //    vector<string> vector02(5,"tony");//声明5个元素的空间,值都是tony
    
    
        //第三种方式常用
        vector<int> vector03;
        //添加元素
        vector03.push_back(111);
        vector03.push_back(222);
        vector03.push_back(333);
        vector03.push_back(444);
    
        //删除元素
        vector03.pop_back();//删除最新的,最后添加的元素,ddd
    
        //获取元素
        int value = vector03.at(0);
        value = vector03[1];
        LOGD("value=%d",value);
    
        //清空元素
        vector03.clear();
    
        // 是否被清空了
        if (vector03.empty()) {
            LOGD("清空");
        } else {
            LOGD("未清空");
        }
    
    // 容器有很严重的问题
        // 此容器,占用的内存空间,是只增不减的
            LOGD("此Vector容器,占用内存空间是:%d",vector03.capacity());
    

    如果是在函数内部声明的,函数执行完后,函数弹栈,所有在栈区申请的内存,全部释放,但是如果是全局的,需要定义一个临时容器

    // 定义一个全局容器
    vector<string> allName;
    
    void test01()
    {
        allName.push_back("1111");
        allName.push_back("2222");
        allName.push_back("3333");
    
        allName.clear(); // 清空 内存空间 还是占用的  怎么办?
    
        // 替换的方式:来解决此问题
        vector<string> tempVector; // 定义临时容器目的:就是为了解决 、 替换全局容器,让全局容器不占用内存空间
        tempVector.swap(allName); // 把全局的 全部移动 给临时 == 把全局的给回收了
    } // 函数一弹栈  tempVector给回收了,就保证了,全局和临时全部回收完毕
    

    序列化容器之priority_queue的基本用法

    先添加头文件
    #include <queue>
    //    priority_queue<int> priorityQueue;
    //    priorityQueue.push(6);
    //    priorityQueue.push(2);
    //    priorityQueue.push(333);
    //    LOGD("第一个元素是:%d",priorityQueue.top());//这里输出的是333,默认排序方式是降序
    
    
        // 优先级队列priority_queue,基于vector实现的
        // greater:把最小的值,放在最前面了
        // less:把最大的值,放在最前面了
        priority_queue<int, vector<int>, greater<int>> priorityQueue2;
        priorityQueue2.push(6);
        priorityQueue2.push(2);
        priorityQueue2.push(333);
        LOGD("第一个元素是:%d",priorityQueue2.top());//这里输出的是333,默认排序方式是降序
    

    我们也可以仿照源码,照葫芦画瓢,自定义排序类:
    源码如下:(感觉很像是java中的compareTo)

    #if _LIBCPP_STD_VER > 11
    template <class _Tp = void>
    #else
    template <class _Tp>
    #endif
    struct _LIBCPP_TEMPLATE_VIS greater : binary_function<_Tp, _Tp, bool>
    {
        _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
        bool operator()(const _Tp& __x, const _Tp& __y) const
            {return __x > __y;}
    };
    

    自定义我们的:

    //
    // Created by ftd_g on 2020/2/18.
    //
    
    #include <iostream>
    #include <android/log.h>
    #include "main.h"
    #include "MyExtends.h"
    #include <vector>//c++容器中提供的
    #include <string>
    #include <queue>
    
    #define TAG "guow"
    //__VA_AGRS__ 代表...的可变参数
    #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG,  __VA_ARGS__)
    using namespace std;
    
    class MyType{
    public:
        int count;
        //构造函数
    public:
        MyType(int count){
            this->count = count;
        }
    };
    
    //这个是完全仿照源码照葫芦画瓢出来的
    struct MyTypeLess
    {
        bool operator()(const MyType& __x, const MyType& __y) const
        {return __x.count > __y.count;}
    };
    int main(){
        priority_queue<MyType,vector<MyType>,MyTypeLess> priorityQueue;
        priorityQueue.push(MyType(20));
        priorityQueue.push(MyType(222222));
        priorityQueue.push(MyType(1));
        LOGD("第一个元素是:%d",priorityQueue.top());
    }
    

    关联性容器set的基本用法

    首先添加头文件:
    #include <set>
    set<int> set1 = {1,2,3,4,5};
        set1.insert(777);
        set1.insert(888);
        set1.insert(999);
    
        // 删除元素
        // set1.erase(1);
    
        // 遍历操作
        set<int>::iterator beginResult = set1.begin(); // 指向容器中的第零个元素的意思
        set<int>::iterator endResult = set1.end(); // 指向容器中的末尾元素的下一个元素
    
        //这里的beginResult可以理解为set1第一个元素的内存地址,通过*内存地址取出该内存地址对应的值
    
        // for 遍历
        for (; beginResult != set1.end() ; beginResult++) {
            // * 取出迭代器里面内存地址所关联对应的具体元素
            LOGD("遍历set it:%d\n",*beginResult);
        }
    

    其中vector遍历和set大同小异

    vector<int> vector1;
        vector1.push_back(1);
        vector1.push_back(2);
        vector1.push_back(3);
        vector1.push_back(4);
        vector1.push_back(5);
    
        vector<int>::iterator it = vector1.begin();
        for (; it < vector1.end() ; it++) {
            LOGD("遍历vector:%d\n",*it);
        }
    

    谢谢观看,有不对或者不详细的地方希望大家在评论区提出宝贵的意见。

    相关文章

      网友评论

          本文标题:2-ndk学习之c++基础篇(04)

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