NDK-CPP语言-queue队列+stack栈+list+set+map

com_tz_ndk_cpp_NDKCpp.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class com_tz_ndk_cpp_NDKCpp */

#ifndef _Included_com_tz_ndk_cpp_NDKCpp
#define _Included_com_tz_ndk_cpp_NDKCpp
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_tz_ndk_cpp_NDKCpp
 * Method:    callCppTest
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppQueue
  (JNIEnv *, jobject);


JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppQueuePriority
        (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppStack
        (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppList
        (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppListDelete
        (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppListInsert
        (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppSet
        (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppSetReverse
        (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppSetSort
        (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppSetFind
        (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppMultiSet
        (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppMap
        (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppMapDelete
        (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppMapFind
        (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppMultiMap
        (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppVectorCopy
        (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


com_tz_ndk_cpp_NDKCpp.cpp

#include 
#include 
#include 
#include "com_tz_ndk_cpp_NDKCpp.h"

using namespace std;

//1.C++语言:queue队列-基本使用
#include 
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppQueue
        (JNIEnv *, jobject){
    //初始化
    queue q;
    //添加元素
    q.push('A');
    q.push('B');
    q.push('C');
    //添加头部
//    q.front() = 'z';
    //添加尾部
//    q.back() = 'D';

    //删除操作
    while (!q.empty()){
        __android_log_print(ANDROID_LOG_INFO,"main","值: %c",q.front());
        //删除
        q.pop();
    }
}


//2.C++语言:queue队列-优先级
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppQueuePriority
        (JNIEnv *, jobject){
    //2.1 添加元素(默认是按照添加的顺序排列)
//    queue q;
//    q.push(10);
//    q.push(50);
//    q.push(20);
//    q.push(5);
//    //打印
//    while (!q.empty()){
//        __android_log_print(ANDROID_LOG_INFO,"main","值: %d",q.front());
//        q.pop();
//    }

    //2.2 最大值优先级队列(从大到小排列)
//    priority_queue pq1;
//    pq1.push(10);
//    pq1.push(50);
//    pq1.push(20);
//    pq1.push(5);
//    while (!pq1.empty()){
//        __android_log_print(ANDROID_LOG_INFO,"main","值: %d",pq1.top());
//        pq1.pop();
//    }

    //2.3 最小值优先级队列
    //注意:不同额编译器对语法检查有差别
    //在AS中进行NDK开发>>符号认为运算符,所以为了避免出现这样的情况,请用空格分离'> >'
    priority_queue,greater > pq1;
    pq1.push(10);
    pq1.push(50);
    pq1.push(20);
    pq1.push(5);
    while (!pq1.empty()){
        __android_log_print(ANDROID_LOG_INFO,"main","值: %d",pq1.top());
        pq1.pop();
    }
}



//3.C++语言:stack栈-基本使用
#include 
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppStack
        (JNIEnv *, jobject){
    stack st;
    st.push(10);
    st.push(20);
    st.push(30);

    while (!st.empty()){
        __android_log_print(ANDROID_LOG_INFO,"main","值: %d",st.top());
        st.pop();
    }
}


//4.C++语言:list-基本使用
#include 
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppList
        (JNIEnv *, jobject){
    list lt;
    //从头部添加
    lt.push_front(10);
    lt.push_front(20);
    lt.push_front(30);
    //从尾部添加
    lt.push_back(40);
    lt.push_back(50);
    lt.push_back(60);

    //循环遍历
    for (list::iterator it = lt.begin() ; it != lt.end() ; it++){
        __android_log_print(ANDROID_LOG_INFO,"main","值:%d",*it);
    }

    list::iterator it = lt.begin();
    //连续相加允许(++)
    //支持'++'、'--'运算符
    it++;
    it--;
    //注意:不支持间断
    //不支持'+'、'-'运算度
//    it = it - 1;

}


//5.C++语言:list-删除
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppListDelete
        (JNIEnv *, jobject){
    list lt;
    //从头部添加
    lt.push_front(10);
    lt.push_front(20);
    lt.push_front(30);
    //从尾部添加
    lt.push_back(40);
    lt.push_back(50);
    lt.push_back(60);

    //方式一
//    list::iterator it = lt.begin();
//    it++;
//    //删除:删除第二个元素
//    lt.erase(it);

    //方式二
    //删除第二个元素(直接根据内容删除)
//    lt.remove(20);

    //方式三:区间删除
    //开始位置
    list::iterator it_begin = lt.begin();
    //结束位置
    list::iterator it_end = lt.begin();
    it_end++;
    it_end++;
    //删除元素(如果已经被删除的元素不能够在删除)
    lt.erase(it_begin,it_end);

    //循环遍历
    for (list::iterator it = lt.begin() ; it != lt.end() ; it++){
        __android_log_print(ANDROID_LOG_INFO,"main","值:%d",*it);
    }
}



//6.C++语言:list-插入
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppListInsert
        (JNIEnv *, jobject){
    list lt;
    //从尾部添加
    lt.push_back(40);
    lt.push_back(50);
    lt.push_back(60);

    //插入
    lt.insert(lt.begin(),30);
    //循环遍历
    for (list::iterator it = lt.begin() ; it != lt.end() ; it++){
        __android_log_print(ANDROID_LOG_INFO,"main","值:%d",*it);
    }
}


//7.C++语言:set-基本使用(元素唯一)-默认从小到大排列
//特点一:元素唯一
//特点二:默认从小到大排列
#include 
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppSet
        (JNIEnv *, jobject){
    set st;
    st.insert(40);
    st.insert(10);
    st.insert(30);
    st.insert(20);

    //删除
    set::iterator it = st.begin();
    st.erase(it);

    for (set::iterator it = st.begin() ; it != st.end() ; it++){
        __android_log_print(ANDROID_LOG_INFO,"main","值:%d",*it);
    }

}


//8.C++语言:set-基本使用(元素唯一)-从大到小排列
//set>
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppSetReverse
        (JNIEnv *, jobject){
    set > st;
    st.insert(40);
    st.insert(10);
    st.insert(30);
    st.insert(20);


    for (set::iterator it = st.begin() ; it != st.end() ; it++){
        __android_log_print(ANDROID_LOG_INFO,"main","值:%d",*it);
    }
}



//9.C++语言:set-自定义排序规则
//需求:根据学生的成绩进行排序
class Student{
private:
    char* name;
    int score;
public:
    Student(char* name,int score){
        this->name = name;
        this->score = score;
    }
    int getScore(){
        return this->score;
    }
    void printStudent(){
        __android_log_print(ANDROID_LOG_INFO,"main","姓名: %s,  成绩: %d",this->name,this->score);
    }
};
//仿函数
struct Soft{
    //方式一:不写常量
//    bool operator()(Student &left,Student &right){
//        return left.getScore() < right.getScore();
//    }
    //方式二:const修饰
    bool operator()(const Student &left,const Student &right){
        //类型转换
        Student stu_left = const_cast(left);
        Student stu_right = const_cast(right);
        return stu_left.getScore() < stu_right.getScore();
    }
};
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppSetSort
        (JNIEnv *, jobject){
    set st;
    st.insert(Student("小宇",50));
    st.insert(Student("梦想",59));
    st.insert(Student("song",55));
    st.insert(Student("远方",58));
    st.insert(Student("石桥中化妖",40));

    for (set::iterator it = st.begin() ; it != st.end() ; it++){
        Student stu = const_cast(*it);
        stu.printStudent();
    }

}

//10.C++语言:set-查找
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppSetFind
        (JNIEnv *, jobject){
    set st;
    st.insert(10);
    st.insert(20);
    st.insert(30);
    st.insert(40);
    st.insert(50);
    st.insert(60);
    st.insert(70);

    //方式一
    //查找等于30元素
    //st.find(2);

    //方式二
    //查找等于或者小余35元素
    //如果存在你输入的值30,那么就返回当前值30(例如:30)
    //如果不存在你查找的值31,那么返回大于31的最近的一个元素指针
    set::iterator it_lower = st.lower_bound(31);
    __android_log_print(ANDROID_LOG_INFO,"main","查找结果: %d",*it_lower);

    //如果存在你查找的值30,那么就返回大于30最近的一个元素指针40
    //如果不存在你查找的值31,那么就返回大于31最近的一个元素的指针40
    set::iterator it_upper = st.upper_bound(31);
    __android_log_print(ANDROID_LOG_INFO,"main","查找结果: %d",*it_upper);

    //方式三:既要返回最小也要最大
    pair::iterator,set::iterator> p = st.equal_range(30);
    //获取返回的元素
    __android_log_print(ANDROID_LOG_INFO,"main","小: %d",*p.first);
    __android_log_print(ANDROID_LOG_INFO,"main","大: %d",*p.second);

}


//11.C++语言:multiset-基本使用
//允许存储重复元素
//默认升序排列
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppMultiSet
        (JNIEnv *, jobject){
    //升序
//    multiset mst;
//    mst.insert(10);
//    mst.insert(20);
//    mst.insert(30);
//    mst.insert(10);
//
//    for (multiset::iterator it = mst.begin() ; it != mst.end() ; it++){
//        __android_log_print(ANDROID_LOG_INFO,"main","值: %d",*it);
//    }

    //降序
//    multiset > mst;
//    mst.insert(10);
//    mst.insert(20);
//    mst.insert(30);
//    mst.insert(10);
//
//    for (multiset::iterator it = mst.begin() ; it != mst.end() ; it++){
//        __android_log_print(ANDROID_LOG_INFO,"main","值: %d",*it);
//    }

    //自定义排序方式
    multiset mst;
    mst.insert(Student("小宇",50));
    mst.insert(Student("梦想",59));
    mst.insert(Student("song",55));
    mst.insert(Student("远方",58));
    mst.insert(Student("石桥中化妖",40));
    mst.insert(Student("Dream",40));
    for (multiset::iterator it = mst.begin() ; it != mst.end() ; it++){
        Student stu = const_cast(*it);
        stu.printStudent();
    }
}



//12.C++语言:map-基本使用
#include 
#include 
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppMap
        (JNIEnv *, jobject){
    map mp;
    //方式一:插入数据pair
    mp.insert(pair(01,"陈国军"));
    mp.insert(pair(02,"Mr.Sunday"));
    mp.insert(pair(03,"Studio"));
    mp.insert(pair(04,"余祚宁"));

    //方式二:如果key存在,那么就不添加同时不覆盖,如果不存在,就添加
    pair::iterator, bool> result = mp.insert(map::value_type(04,"相约98"));
    if(result.second){
        __android_log_print(ANDROID_LOG_INFO,"main","添加成功!");
    }else{
        __android_log_print(ANDROID_LOG_INFO,"main","已存在,添加失败!");
    }

    //方式三:
    mp.insert(make_pair(05,"定定"));

    //方式四:如果key存在,重复添加会覆盖,如果不存在,那就直接添加
    mp[5] = "石桥中化妖";
    mp[6] = "定定";

    for (map::iterator it = mp.begin() ; it != mp.end() ; it++){
        //获取key:it->first
        __android_log_print(ANDROID_LOG_INFO,"main","key: %d",it->first);
        //获取value:it->second
        __android_log_print(ANDROID_LOG_INFO,"main","value: %s",it->second.c_str());
    }

}



//13.C++语言:map-删除
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppMapDelete
        (JNIEnv *, jobject){
    map mp;
    mp.insert(pair(01,"陈国军"));
    mp.insert(pair(02,"Mr.Sunday"));
    mp.insert(pair(03,"Studio"));
    mp.insert(pair(04,"余祚宁"));

    //删除
    map::iterator it = mp.begin();
    mp.erase(it);

    //打印
    for (map::iterator it = mp.begin() ; it != mp.end() ; it++){
        //获取key:it->first
        __android_log_print(ANDROID_LOG_INFO,"main","key: %d",it->first);
        //获取value:it->second
        __android_log_print(ANDROID_LOG_INFO,"main","value: %s",it->second.c_str());
    }
}



//14.C++语言:map-查找(equal_range)
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppMapFind
        (JNIEnv *, jobject){
    map mp;
    mp.insert(pair(01,"陈国军"));
    mp.insert(pair(02,"Mr.Sunday"));
    mp.insert(pair(03,"Studio"));
    mp.insert(pair(04,"余祚宁"));

    //获取大于或者等于2的元素
    pair::iterator,map::iterator> p = mp.equal_range(2);
    //判断是否存在元素
    if(p.first != mp.end()){
        //等于2
        //获取key:it->first
        __android_log_print(ANDROID_LOG_INFO,"main","key: %d",p.first->first);
        //获取value:it->second
        __android_log_print(ANDROID_LOG_INFO,"main","value: %s",p.first->second.c_str());

        //大于2元素
        //获取key:it->first
        __android_log_print(ANDROID_LOG_INFO,"main","key: %d",p.second->first);
        //获取value:it->second
        __android_log_print(ANDROID_LOG_INFO,"main","value: %s",p.second->second.c_str());
    }
}



//15.C++语言:multimap-一对多
//需求:一个用户对应多个订单
class Order{
private:
    char* name;
    int num;
public:
    Order(char* name,int num){
        this->name = name;
        this->num = num;
    }
    void printOrder(){
        __android_log_print(ANDROID_LOG_INFO,"main","订单名称:%s, 订单号:%d",this->name,this->num);
    }
};
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppMultiMap
        (JNIEnv *, jobject){

    multimap mst;
    mst.insert(make_pair("陈国军",Order("男士外套",01)));
    mst.insert(make_pair("陈国军",Order("户外跑鞋",02)));

    mst.insert(make_pair("梦想",Order("女士外套",03)));
    mst.insert(make_pair("梦想",Order("女士高跟鞋",02)));

    mst.insert(make_pair("Dream",Order("女士纱衣",03)));
    mst.insert(make_pair("Dream",Order("女士布鞋",02)));
    mst.insert(make_pair("Dream",Order("女士外套",02)));
    mst.insert(make_pair("Dream",Order("女士裤子",02)));

    //遍历
//    for (multimap::iterator it = mst.begin() ; it != mst.end() ; it++){
//        //获取key:it->first
//        __android_log_print(ANDROID_LOG_INFO,"main","key: %s",it->first.c_str());
//        //获取value:it->second
//        Order order = const_cast(it->second);
//        order.printOrder();
//    }


    //需求:只获取"梦想"订单
    //获取订单的数量
    int count = mst.count("梦想");
    //打印"梦想"订单:找到
    multimap::iterator it = mst.find("梦想");
    //循环遍历打印
    //计数
    int i = 0;
    while (it != mst.end() && i < count){
        __android_log_print(ANDROID_LOG_INFO,"main","key: %s",it->first.c_str());
        Order order = const_cast(it->second);
        order.printOrder();
        i++;
        it++;
    }
}



//16.C++语言:vector-浅拷贝和深拷贝
class User{
private:
    char* name;
    int age;
public:
    //浅拷贝(默认就是浅拷贝)
    User(char* name,int age){
        //动态分配内存
        this->name = new char[strlen(name)+1];
        strcpy(this->name,name);

        this->age = age;
    }
    ~User(){
        if(this->name != NULL){
            delete[] this->name;
            this->name = NULL;
            this->age = 0;
        }
    }
    void printUser(){
        __android_log_print(ANDROID_LOG_INFO,"main","名称:%s, 年龄: %d",this->name,this->age);
    }

    //深拷贝
    User(const User &user){
        //先释放内存
        if(this->name != NULL){
            delete[] this->name;
            this->name = NULL;
            this->age = 0;
        }
        //动态分配内存
        this->name = new char[strlen(user.name)+1];
        strcpy(this->name,user.name);
        this->age = user.age;
    }

    User& operator=(User &user){
        if(this->name != NULL){
            delete[] this->name;
            this->name = NULL;
            this->age = 0;
        }
        //动态分配内存
        this->name = new char[strlen(user.name)+1];
        strcpy(this->name,user.name);
        this->age = user.age;
        return *this;
    }

};
//class User{
//private:
//    string* name;
//    int age;
//public:
//    //浅拷贝(默认就是浅拷贝)
//    User(string name,int age){
//        //动态分配内存
//        this->name = new string(const_cast(name));
//        this->age = age;
//    }
//    ~User(){
//        if(this->name != NULL){
//            delete this->name;
//            this->name = NULL;
//            this->age = 0;
//        }
//    }
//    void printUser(){
//        __android_log_print(ANDROID_LOG_INFO,"main","名称:%s, 年龄: %d",this->name,this->age);
//    }
//
//    //深拷贝
//    User(const User &user){
//        //先释放内存
//        if(this->name != NULL){
//            delete this->name;
//            this->name = NULL;
//            this->age = 0;
//        }
//        //动态分配内存
//        this->name = new string(const_cast(user.name));
//        this->age = age;
//    }
//
//    User& operator=(User &user){
//        if(this->name != NULL){
//            delete this->name;
//            this->name = NULL;
//            this->age = 0;
//        }
//        //动态分配内存
//        this->name = new string(const_cast(user.name));
//        this->age = age;
//        return *this;
//    }
//
};
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppVectorCopy
        (JNIEnv *, jobject){
    vector vt;
    User user("石桥中化妖",18);
    //实参作为形参,需要调用拷贝函数,然后默认是浅拷贝
    vt.push_back(user);

    //解决方案:深拷贝
    for (vector::iterator it = vt.begin() ; it != vt.end() ; it++){
        User order = const_cast(*it);
        order.printUser();
    }

    //作业:string如何深拷贝(稍微麻烦一点)
}



摘自示例代码





你可能感兴趣的:(C,ndk,jni)