无题
概述 高通发布的FastCV是一个针对移动平台的计算机视觉库,如今的版本支持运行在windows、Mac和Linux等大部分平台,并对于高通自家的Snapdragon做了特别优化的。FastCV提了为移动设备优化的计算机视觉(CV)库,包括移动设备广泛使用的视觉处理函数和大众市场手机。中间件开发人员可以使用FastCV构建框架开发人员所需要的计算机视觉用用,高通的AR(增强现实)SDK就是一个采用了FastCV的很好的例子。CV应用的开发者们在开发他们的应用时可以直接使用FastCV函数。
使用指南初始化
12345// 启用 FastCV 时需要初始化模式和内存 #ifdef BUILD_FASTCV // @see fastcv.h -> fcvOperationMode int ret = fcvSetOperationMode(FASTCV_OP_CPU_OFFLOAD); if (ret != 0) { VLOGE(TAG, "Fail to fcvSetOperationMode, return code is %d", r ...
无题
概述STL容器的clear的时间复杂度不是O(1)可能很多人都不在意,在使用STL容器的时候,潜意识里面将clear()成员函数视为常量时间复杂度O(1)的。但是其实不然。我感觉可能是很多人都知道对于vector而言,clear()之后,修改了size()的结果,不影响capacity()的结果,因而得出clear()只是修改了某个标记,是常量时间复杂度的错误结论。
其实C++标准明确指出不管是序列容器(比如vector)还是关联容器(比如unordered_map)其clear()成员函数都是线性时间复杂度O(n)的。因为只要执行了clear()就需要对其存储的元素调用析构函数,这个析构操作显然是逐个析构的。因而时间复杂度是O(n)。
auto替代手写类型比如在基于范围的循环中尽量使用auto&,否则容易踩坑。这个观点在Scott Meryer的《Effictive Modern C++》一书的条款5中已经讲得很清楚了。
下面简要概述一下,对于unordered_map而言,其中的元素类型是:
1std::pair<const std::string, int>
...
无题
文章参考:http://c.biancheng.net/view/298.html
概述C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等。一旦用户在程序中定义了自己的数据类型名称,就可以在该程序中用自己的数据类型名称来定义变量的类型、数组的类型、指针变量的类型与函数的类型等。
例如,C 语言在 C99 之前并未提供布尔类型,但我们可以使用 typedef 关键字来定义一个简单的布尔类型,如下面的代码所示:
123typedef int BOOL;#define TRUE 1#define FALSE 0
定义好之后,就可以像使用基本类型数据一样使用它了,如下面的代码所示:
1BOOL bflag=TRUE;
用法在实际使用中,typedef 的应用主要有如下4种。
1) 为基本数据类型定义新的类型名也就是说,系统默认的所有基本类型都可以利用 typedef 关键字来重新定义类型名,示例代码如下所示:
1typedef unsigned int COU ...
无题
前面,我们已经系统的对List和Map进行了学习。接下来,我们开始可以学习Set。相信经过Map的了解之后,学习Set会容易很多。毕竟,Set的实现类都是基于Map来实现的(HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的)。
首先,我们看看Set架构。
1234567891011121314151617181920212223242526272829303132public interface Set<E> extends Collection<E> { int size(); boolean isEmpty(); boolean contains(Object o); Iterator<E> iterator(); Object[] toArray(); <T> T[] toArray(T[] a); boolean add(E e); boolean remove(Object o); ...
无题
自定对象数组文章参考:https://stackoverflow.com/questions/10071502/read-writing-arrays-of-parcelable-objects
Android项目中使用FlatBuffer教程一
[TOC]
概述关于FlatBuffers的使用,我们不在这里详细介绍:
C++11并发编程之Atomic学习
[TOC]
概述文章参考:https://cplusplus.com/reference/atomic/atomic/atomic/
文章参考:https://blog.csdn.net/wanxuexiang/article/details/104280021
atomic头文件结构<atomic>头文件:原子类型是封装了一个值的类型,它的访问保证不会导致数据的竞争,并且可以用于在不同的线程之间同步内存访问。
这个头声明了两个c++类,原子和atomic_flag,它实现了自包含类中的原子类型的所有特性。header还声明了整个C样式类型和函数与C中的原子支持兼容。
class
atomic
用于bool、整数和指针类型的原子类模板和特殊化 (类模板)
atomic_flag
无锁布尔原子类型(类)
Types
memory_order
为给定的原子操作定义内存排序约束(typedef)
atomic原子操作支持bool、int、char等数据数据类型,但是不支持浮点数类型 ,下表为基本数据类型、c-style支持的类型、对应的at ...
pthread_key_t和pthread_key_create学习
[TOC]
概述文章参考:https://www.jianshu.com/p/d52c1ebf808a
线程中特有的线程存储, Thread Specific Data 。线程存储有什么用了?他是什么意思了?大家都知道,在多线程程序中,所有线程共享程序中的变量。现在有一全局变量,所有线程都可以使用它,改变它的值。而如果每个线程希望能单独拥有它,那么就需要使用线程存储了。表面上看起来这是一个全局变量,所有线程都可以使用它,而它的值在每一个线程中又是单独存储的。这就是线程存储的意义。
下面说一下线程存储的具体用法。
创建一个类型为pthread_key_t类型的变量。
调用pthread_key_create()来创建该变量。该函数有两个参数,第一个参数就是上面声明的pthread_key_t变量,第二个参数是一个清理函数,用来在线程释放该线程存储的时候被调用。该函数指针可以设成 NULL,这样系统将调用默认的清理函数。该函数成功返回0.其他任何返回值都表示出现了错误。
当线程中需要存储特殊值的时候,可以调用 pthread_setspcific() 。该函数有两个参数,第一个为前面 ...
Android主题换肤框架Android-skin-support学习
[TOC]
文章参考:https://github.com/ximsfei/Android-skin-support
概述今天给大家推荐一个非常非常棒的 Android 换肤框架。
这个换肤框架就是:Android-skin-support,极低的学习成本,极好的用户体验. “一行” 代码就可以实现换肤。
目前该开源项目高达 5.6k 的 star 数。
一行代码如下:
1SkinCompatManager.withoutActivity(this).loadSkin();
就这么简单, 你的APK已经拥有了强大的换肤功能, 当然现在是拥有了换肤功能。
当然,我们还需要制作换肤包
使用方法12345678910//==========<editor-folder desc = "Dependence:AndroidSupportSkin框架">===========================// skin-support 基础控件支持implementation 'skin.support:skin-support:3.1.4' ...