C++ STL(Standard Template Library标准模板库),相当于java的集合模块, STL 有很多的容器。

1.c++ vector向量(内部:封装动态大小数组作为容器,能够存放任意的动态数组)

#include <iostream>#include <vector> // 引入 vector 容器的支持
// NDK 开发 一定要用容器  应该 queue 队列
using namespace std;
int main() {vector<int> vector1;vector<int> vector2(10); // 指定10的空间大小vector<int> vector3(10, 0); // 有了10个值了 每个值都是0vector<int> vector4;// 插入数据vector4.insert(vector4.begin(), 40);vector4.insert(vector4.begin(), 60);vector4.insert(vector4.begin(), 80);// 第一个cout << " 修改前:vector4.front():" << vector4.front() << endl;vector4.front() = 99; // 默认修改第一个cout << " 修改后:vector4.front():" << vector4.front() << endl;// 最后一个cout << " 修改前:vector4.back():" << vector4.back() << endl;vector4.back() = 777; // 默认修改最后cout << " 修改后:vector4.back():" << vector4.back() << endl;vector4.erase(vector4.begin()); // 移除第一个元素(内部:通过迭代器的位置 进行移除)  删除// 循环打印,默认 从大到小输出for (int i = 0; i < vector4.size(); ++i) {cout << "item:" << vector4[i] << endl;}// 迭代器 循环遍历// auto Kotlin自带类型推到// for (vector<int>::iterator iteratorVar = vector4.begin(); iteratorVar != vector4.end(); iteratorVar++) {for (auto iteratorVar = vector4.begin(); iteratorVar != vector4.end(); iteratorVar++) {// 迭代器 当中指针操作  iteratorVar++cout << "迭代器:" << *iteratorVar << endl;}cout << "" << endl;return 0;
}
  • vector4.begin() 迭代器 插入到前面
  • vector4.end() 迭代器 插入到后面

2.c++ stack 栈

#include <stack>
using namespace std;int main() {stack<int> stackVar;stackVar.push(30);stackVar.push(60);stackVar.push(90);while (!stackVar.empty()) {int top = stackVar.top(); // top == 获取栈顶的元素cout << "获取栈顶的元素:" << top << endl; // 永远拿 90stackVar.pop(); // 把栈顶的元素 弹出去  【删除】}return 0;
}

栈没有迭代器,不能指定位置压栈等

3.c++ queue 队列

#include <queue>
using namespace std;int main() {queue<int> queueVar;queueVar.push(20);queueVar.push(40);queueVar.push(60);// 第一个元素cout << " 修改前: queueVar.front():" << queueVar.front() << endl;queueVar.front() = 88;cout << " 修改后: queueVar.front():" << queueVar.front() << endl;// 最后一个cout << " 修改前: queueVar.back():" << queueVar.back() << endl;queueVar.back() =99;cout << " 修改后: queueVar.back():" << queueVar.back() << endl;while (!queueVar.empty()) {cout << "while1:" << queueVar.front() << endl;queueVar.pop(); // 把前面的元素 给消费掉  【删除】}return 0;
}

queue队列内部是通过数组和链表实现的,这个数据结构应用场景比较多,音视频编解码啥的都会用到,遵守FIFO 原则。

4.优先级队列

#include <iostream>
#include <queue>
using namespace std;int main() {// priority_queue<int> priorityQueue;priority_queue<int ,vector<int>, less<int>> priorityQueue;priorityQueue.push(10);priorityQueue.push(20);priorityQueue.push(30);priorityQueue.push(100);priorityQueue.push(50);priorityQueue.push(60);cout << priorityQueue.top() << endl; // 60// 循环代码while (!priorityQueue.empty()) {cout << "while1:" << priorityQueue.top() << endl; priorityQueue.pop(); // 最前面的元素消费掉}return 0;
}
  • priority_queue 内部对我们前面的vector 有一定的封装
  • 优先级队列会自动进行排序操作
  • priority_queue priorityQueue:这样声明优先级队列,相当于priority_queue<int ,vector, less> priorityQueue,省略了比较策略等
  • less return __x < __y: 从大到小
  • greater return __x > __y: 从小到大

5.c++ list

#include <iostream>
#include <list>
using namespace std;int main() {list<char*> listVar;// 插入操作listVar.push_front("唐三"); // 插入到前面   明确listVar.push_back("小舞"); // 插入到后面listVar.insert(listVar.begin(),"宁荣荣"); // 插入到前面  灵活listVar.insert(listVar.end(), "马红俊"); // 插入到后面//    // 修改操作
//    listVar.back() = 88;
//    listVar.front() = 55;//    // 删除
//    listVar.erase(listVar.begin()); // 删除最前面的 55
//    listVar.erase(listVar.end()); // 删除最后面的 88for (auto it = listVar.begin(); it != listVar.end() ; it ++) {cout << *it << endl;}return 0;
}
  • Java:ArrayList采用Object[]数组, C++的list 内部:采用链表
  • 不用通过角标去访问、修改 、遍历

6.c++ set 集合

#include <iostream>
#include <set>using namespace std;int main() {set<int, less<int>> setVar;setVar.insert(1);setVar.insert(3);setVar.insert(2);setVar.insert(4);pair<set<int, less<int>>::iterator, bool> res = setVar.insert(4);bool insert_success = res.second;if (insert_success) {cout << "插入成功" << endl;} else {cout << "插入失败" << endl;}for (auto it = setVar.begin(); it != setVar.end() ; it ++) {cout << *it << endl;}return 0;
}
  • set(内部:红黑树结构),会对你存入的数据进行排序,不允许元素相同
  • __x < __y 从小到大,默认情况下 就是 less
  • 添加参数,不需要用迭代器,也不需要指定位置
  • 重复插入,会提示插入失败

7.c++ map函数

#include <iostream>
#include <map>using namespace std;int main() {// 注意:map会对key进行排序,默认 key不能重复map<int, string> mapVar;// TODO 添加数据// 第一种方式mapVar.insert(pair<int, string>(1, "唐三"));// 第二种方式mapVar.insert(make_pair(2, "小舞"));// 第三种方式mapVar.insert(map<int, string>::value_type (3, "宁荣荣"));// 上面三种方式 key不能重复// 思考:既然会对key进行排序,那么key是不能重复的(会插入失败)std::pair<map<int,string>::iterator ,bool> r=mapVar.insert(pair<int, string>(3, "宁荣荣2"));   // 注意这个方式是插入失败了//通过pair的方式if (r.second){cout << "插入成功" << endl;}else{cout << "插入失败" << endl;}// 第四种方式    mapVar[key]=ValuemapVar[4] = "马红俊";mapVar[4] = "比比东"; // 第四种方式覆盖/替换(常用)/***  typedef typename _Rep_type::iterator       iterator;  之前常规的迭代器typedef typename _Rep_type::const_iterator  const_iterator;  只读的,只能读,不能修改 的迭代器typedef typename _Rep_type::reverse_iterator    reverse_iterator;  倒序打印的迭代器*/// 循环打印,迭代器for (map<int, string>::iterator it = mapVar.begin() ; it != mapVar.end() ; it ++) {cout << it->first << "," << it->second.c_str() << "\t";}cout << endl;// 查找,操作map<int, string> ::iterator findResult = mapVar.find(3); // 查找if (findResult != mapVar.end()) {cout << "恭喜,找到了" << findResult->first << "," << findResult->second.c_str() << endl;} else {cout << "没找到了" << endl;}//删除元素mapVar.erase(5);    //如果删除的元素不存在  也不会报错// 循环打印,迭代器for (map<int, string>::iterator it = mapVar.begin() ; it != mapVar.end() ; it ++) {cout << it->first << "," << it->second.c_str() << "\t";}cout << endl;return 0;
}
  • 通过pair 插入数据如果id重复会插入失败,不会覆盖
  • 通过mapVar[4] = "马红俊"这个方式插入数据,如果id重复会进行覆盖
  • 通过erase函数删除元素,如果id不存在不会报错

8.c++ multimap容器

#include <iostream>
#include <map>using namespace std;int main() {multimap<int, string> multimapVar;multimapVar.insert(make_pair(10, "十个1"));multimapVar.insert(make_pair(10, "十个2"));multimapVar.insert(make_pair(10, "十个3"));multimapVar.insert(make_pair(30, "三十1"));multimapVar.insert(make_pair(30, "三十3"));multimapVar.insert(make_pair(30, "三十2"));multimapVar.insert(make_pair(20, "二十1"));multimapVar.insert(make_pair(20, "二十2"));multimapVar.insert(make_pair(20, "二十3"));for (auto iteratorVar = multimapVar.begin(); iteratorVar != multimapVar.end() ; iteratorVar ++) {cout << iteratorVar->first << "," << iteratorVar->second << endl;}cout << endl;int result;cout << "请输入你要查询的key,为int类型:" << endl;cin >> result;multimap<int, string>::iterator iteratorVar = multimapVar.find(result);while (iteratorVar != multimapVar.end()) {cout << iteratorVar->first << "," << iteratorVar->second << endl;iteratorVar++;if (iteratorVar->first != result) {break;;}//        if (iteratorVar == multimapVar.end()) {
//            break;
//        }}return 0;
}
  • multimap核心功能是分组
  • multimap key可以重复,key重复的数据可以分组,key会自动进行排序

9.c++ 谓词

c++ 谓词 概念: 返回bool类型的仿函数称为谓词 。

如果operator()接受一个参数,那么叫做一元谓词 如果operator()接受两个参数,那么叫做二元谓词。

#include <iostream>
#include <set>using namespace std;class Person {
public:string name;int id;Person(string name, int id) : name(name), id(id) {}
};// 自定义谓词 (仿函数)
struct doCompareAction2 {
public:bool operator() (const Person& __x, const Person& __y) {return __x.id < __y.id;}
};struct doCompareAction3 {
public:bool operator() (const Person& __x, const Person& __y) {return __x.id > __y.id;}
};int main() {set<Person, doCompareAction2> setVar;// set<Person, doCompareAction3> setVar;// 构建对象Person p1 ("Snake", 1);Person p2 ("kevin", 2);Person p3 ("Derry", 3);// 把构建的对象 插入到 set 容器里面去setVar.insert(p1);setVar.insert(p2);setVar.insert(p3);for (set<Person>::iterator it = setVar.begin(); it != setVar.end() ; it ++) {cout << it->name.c_str() << " , " << it->id << endl;}return 0;
}
  • c++ Set集合,默认的谓词不能对对象类型的比较,如果set集合传入对象类型需要自定义谓词来处理
  • 谓词定义的规则:定义一个结构体,bool operator() 这部分是固定格式 参数部分是两个常量引用类型数据,返回比较两个对象的维度就可以

10.c++ 内置预定义函数

// C++ 预定义函数(C++ 内置函数)#include <iostream>using namespace std;int main() {// "Derry" + "AAAA" // 运算符重载// C++已经提供了 预定义函数  plus,minus,multiplies,divides,modulus ...plus<int> add_func;int r = add_func(1, 1);cout << r << endl;plus<string> add_func2;string r2 = add_func2("AAAA", "BBB");cout << r2 << endl;plus<float> add_func3;float r3 = add_func3(4354.45f, 34.3f);cout << r3 << endl;return 0;
}

Android NDK篇-C++之 SLT 中的容器与函数谓词相关推荐

  1. android c 对象为空,ndk-jni中C/C++接口函数修改函数参数jobject对象成员值(数组)的有关问题...

    ndk-jni中C/C++接口函数修改函数参数jobject对象成员值(数组)的问题 现java中有个类: public class TestClass { private int nValue; p ...

  2. 【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )

    文章目录 一.创建支持 Kotlin 的 NDK 项目 二.Kotlin 语言中使用 NDK 要点 1.加载动态库 2.声明 ndk 方法 3.Project 下的 build.gradle 配置 4 ...

  3. android ndk配置环境,在Windows中的安装Android NDK开发环境

    我学习NDK的时候,已经不再需要安装cygwin及gcc,make等编译工具,NDK包已经为你准备好一切 :-) 第一步 下载 NDK 登录 http://developer.android.com/ ...

  4. C++STL中vector容器 assign()函数的用法

    http://blog.sina.com.cn/s/blog_7b3a697301014aam.html assign函数: 函数原型: void assign(const_iterator firs ...

  5. Android提升篇系列:Activity recreate(Activity 重新创建/自我恢复)机制(一)

    注:本文中的recreate是指当内存不足时,Activity被回收,但再次来到此Activity时,系统重新恢复的过程. 例如:当Activity A到Activity B时,如果内存不足,A被回收 ...

  6. gather torch_浅谈Pytorch中的torch.gather函数的含义

    pytorch中的gather函数 pytorch比tensorflow更加编程友好,所以准备用pytorch试着做最近要做的一些实验. 立个flag开始学习pytorch,新开一个分类整理学习pyt ...

  7. Matlab中的那些数学函数

    前言 本来是打算写关于矩阵的一些东西,但是弄了一半,发现需要的线代知识有点多,直接讲相关的使用,就太直白了,可能根本无法理解是什么意思,如果讲线代的知识,就感觉和该系列的文不太符,所以直接弃了那部分, ...

  8. js定义全局变量 vue页面_在vue项目中 实现定义全局变量 全局函数操作

    写在前面: 如题,在项目中,经常有些函数和变量是需要复用,比如说网站服务器地址,从后台拿到的:用户的登录token,用户的地址信息等,这时候就需要设置一波全局变量和全局函数,这两个设置不太难,而且有一 ...

  9. Python中random模块常用函数/方法(2)——random.random(),random.randint()和random.uniform()

    1.random.random():生成一个0到1的随机符点数: 0 <= n < 1.0 语法:random.random() #生成一个0~1之间的随机浮点数 print(" ...

  10. Android NDK开发之旅(2):一篇文章搞定Android Studio中使用CMake进行NDK/JNI开发

    Android NDK开发之旅(2):一篇文章搞定android Studio中使用CMake进行NDK/JNI开发 (码字不易,转载请声明出处:http://blog.csdn.NET/andrex ...

最新文章

  1. ​机器学习中必要的数学基础!
  2. android控制wifi状态
  3. java包含点_Java的21个核心技术点,你知道吗
  4. DataTables鼠标停留高亮行并且鼠标点击二倍高亮行
  5. Linux apache2将目录从/var/www/html调整为/根目录时报错:You don‘t have permission to access / on this server
  6. c语言十六进制字符串转整数,C语言-提取字符串中的十六进制数字并转换为一个十进制整数输出...
  7. 针对windowsserver 创建iis站点访问出错的解决方案(HTTP 错误 500.19 - Internal Server Error)...
  8. JedisPool.getResource()方法卡死的解决办法
  9. flash作业_在线作业产品的基本构成与逻辑分解
  10. python成语接龙代码_#python# 成语接龙(二)
  11. 运筹学 matlab实现运输问题(表上作业法)
  12. 苹果CMS插件安装使用下载苹果CMS插件集合
  13. 快商通智能客服云平台入选中科院《互联网周刊》“智能营销榜”
  14. 微信小程序页面回到顶端的方式
  15. 如何重装java tm_彻底重装JDK的方法
  16. 【IDEA 教程系列第 3 篇】idea 设置代码提示不区分大小写
  17. 【Pandas 数据分析 2】数据结构
  18. Oracle索引梳理系列(六)- Oracle索引种类之函数索引
  19. 多标签分类算法的研究进展
  20. Appium自动化测试框架

热门文章

  1. 静态网页,动态网页,伪静态网页区别以及优缺点
  2. 牛客输入输出(依图科技)
  3. 大型即时通讯系统微信、陌陌架构分析全记录!
  4. 光源与打光该如何选择,如何获得一副好图像,机器视觉第二步,选择光源和如何打光
  5. 昔日无痕,沧桑有迹-魔幻般的2020
  6. 一维优化 方法c语言,第三章一维优化方法
  7. SQL Server安装中错误该性能计数器注册表配置单元已损坏。若要继续,必须修复该性能计数器注册表配置单元的解决
  8. 树莓派 Pico ADC温度测量
  9. 电影票的c语言程序,不知道电影票在小程序也能购买的?分享3款购票小程序赶紧来看看!...
  10. 2021年10月世界编程语言排行