数组中不能存放基本数据类型,必须存放对象,因此如果要存放基本数据类型,先进行NSTimer封装
NSArray的用法:
第一、初始化
NSArray *firstArray=[[NSArray alloc] initWithObjects:@"one",@"two",@"three", nil]; NSArray *secondArray=[NSArray arrayWithArray:firstArray];第二、获取元素个数和访问
NSLog(@"the number is %ld",[secondArray count]); NSLog(@"the value is %@",[secondArray objectAtIndex:2]);
第三、追加数据元素
NSArray *thirdArray=[firstArray arrayByAddingObjectsFromArray:secondArray];
第四、数组转化为字符串
NSString *str=[firstArray componentsJoinedByString:@".."]; NSLog(@"the number is %@",str);
第五、判断是否包含字符串
NSArray *firstArray=[[NSArray alloc] initWithObjects:@"one",@"two",@"three", nil]; NSLog(@"has value %d",[firstArray containsObject:@"two"]); NSLog(@"has value %ld",[firstArray indexOfObject:@"two"]); NSLog(@"the last object is %@",[firstArray lastObject]);
NSMutalbeArray 的用法-
第一、基本的增删改
NSMutableArray *mutableArr=[NSMutableArray arrayWithCapacity:4]; [mutableArr addObject:@"hello"]; [mutableArr addObject:@"hello"]; [mutableArr addObject:@"hello"]; [mutableArr addObject:@"richard"]; [mutableArr insertObject:@"yang" atIndex:1]; NSLog(@"%@",mutableArr); [mutableArr removeObject:@"hello"]; [mutableArr removeObjectAtIndex:0]; [mutableArr removeLastObject]; NSLog(@"%@",mutableArr);
第二、替换操作
[mutableArr replaceObjectAtIndex:0 withObject:@"kaixin"];
第三、遍历
NSMutableArray *mutableArr=[NSMutableArray arrayWithCapacity:4]; [mutableArr addObject:@"hello"]; [mutableArr addObject:@"hello"]; [mutableArr addObject:@"hello"]; for(int index=0;index<[mutableArr count];index++) { NSLog(@"the val is %@",[mutableArr objectAtIndex:index]); } for(NSString *str in mutableArr) { NSLog(@"%@",str); } for (id str in mutableArr) { NSLog(@"%@",str); }
使用Qt的QObject类实现多叉树
最近研究骨骼动画,需要显示人物模型的骨骼结构,说到骨骼结构,在计算机图形学中通常用树状结构来描述,在一篇介绍骨骼动画的文章中也谈到了树状结构。树是一种数据结构,它通常通过链式结构的形式来存储,能够直观地表达自然界的层次关系。正是因为树的这些特点,它非常适合渲染骨骼。
接下来就是如何实现树状结构了,虽然我以前实现过二叉树,但是这次要做的是多叉树,它具有多个孩子,还是有些不同的。一位高手自己通过std::vector和链式结构实现了多叉树,而强大的Qt开发框架似乎没有这样的数据结构?难道我也要自己动手?
回家的路上我想到Qt不是有父子树结构吗?通过这样特殊的数据结构可以省去了delete操作符的调用,实现了半自动内存管理。其实Qt的父子树结构也可以用作二叉树和多叉树。下面请看我写的一小段代码:
#include <QDebug> #include <QCoreApplication> #include <QObject> #include <QRegularExpression> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QObject* pA1 = new QObject( Q_NULLPTR ); pA1->setObjectName( "A1" ); QObject* pB1 = new QObject( pA1 ); pB1->setObjectName( "B1" ); QObject* pB2 = new QObject( pA1 ); pB2->setObjectName( "B2" ); QObject* pC1 = new QObject( pB2 ); pC1->setObjectName( "C1" ); QObject* pC2 = new QObject( pB2 ); pC2->setObjectName( "C2" ); QObject* pC3 = new QObject( pB2 ); pC3->setObjectName( "C3" ); QObject* pD1 = new QObject( pC2 ); pD1->setObjectName( "D1" ); pA1->dumpObjectTree( ); qDebug( ) << pA1->findChildren<QObject*>( QRegularExpression("B" ), Qt::FindDirectChildrenOnly); delete pA1; return a.exec(); }
在这里我创建了几个QObject对象,其中ABCD代表着四个层级,通过QObject::dumpObjectTree()可以在控制台上看到我们创建的树的情况,而要查找它的孩子,Qt也有多个版本的QObject::findChild()模版函数和QObject::findChildren()模版函数。要注意的是,要创建基于QObject的多叉树,所有的节点(QObject)都必须在堆上创建,因为在析构的时候Qt在内部会调用delete操作符,这就要求操作数必须在堆上创建,否则出错。我的另外一篇文章讲到了Qt父子系统更多内容。
那么如何遍历树的所有节点?也不难,通过这样调用:findChildren<QObject*>( QString() );就可以获得QObject的所有孩子(不包括本身),需要注意的是,这样的遍历方法是先序遍历方法。
Qt还提供了一个函数QObject::children(),它用来返回的是它的直属孩子。当然也可以通过findChildren<QObject*>( QString(), Qt::FindDirectChildrenOnly );来实现。
介绍
现在比较流行的编程语言基本上都自带了某种交互式工具,可以在里头直接输入代码,就地执行观察结果。比如Groovy提供的Groovy Shell和Groovy
Console。
为了方便自己学习OpenGL ES2.0,快速试验各种API,我用Java Swing写了一个简单的应用:OpenGL Console。OpenGL Console和Groovy Console类似,在编辑器里输入Groovy脚本,调用各种OpenGL API,点击运行按钮便可立即看到效果:
用到的技术 Groovy 2.1.7语法着色的Groovy代码编辑器使用了ConsoleTextEditor,执行Groovy脚本使用了GroovyShell。
OpenGL库使用了JOGL2.0.2,JOGL为Java Swing应用提供了GLJPanel,用起来很简单,详情可以参考这个网页
GradleOpenGL Console用Gradle构建,对Gradle不太熟悉的可以看看我写的这篇文章
编译和运行OpenGL Console安装Java7
安装Gradle
从github下载最新的OpenGL Console代码,解压到某个目录,比如D:\opengl-console-master
打开命令行,cd到OpenGL Console目录:
运行gradle installApp命令编译OpenGL Console代码并生成可执行文件:
进入opengl-console-master\build\install\glconsole\bin目录,双击glconsole.bat运行OpenGL Console:
点击Run Script按钮运行脚本:
底部是输出窗口,可以看到脚本运行结果(点击Clear Output按钮可以清除输出):
右上角是绘图区域,可以拖动窗口改变这个区域的大小: