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

2020-02-20  本文已影响0人  ftd黑马

容器

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);
    }

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

上一篇下一篇

猜你喜欢

热点阅读