android ndk queue,NDK 数据结构之队列与栈等的实现

NDK 数据结构之队列与栈等的实现

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如何深拷贝(稍微麻烦一点)

}

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值