zoukankan      html  css  js  c++  java
  • ObjectARX递归AcArray数组组合函数

    ObjectARX递归AcArray数组组合函数

    图文by edata  , 转载注明出处 http://www.cnblogs.com/edata 

    ObjectARX QQ群: 630401507 (仅ObjectARX)
    AutoCAD.net QQ群: 193522571 (ObjectARXAutoLispAutoCAD.net)

    函数源码

     为了通用,写为函数模板.代码如下

        // 指定组合数量递归函数模板(1 2 3) n=1 => (1) (2) (3) n=2 => (1 2) (1 3) (2 3)
        template <class T>
        static AcArray<T> combination(T arr,int m)
        {
            AcArray<T> arrs;
            if (arr.length()>0 && m > 0)
            {
                T cdr=arr;
                cdr.removeFirst();            
                AcArray<T> tmparrs1=combination(cdr,m-1);
                if (tmparrs1.isEmpty() && m ==1)
                {
                    T tmp;
                    tmp.append(arr.first());
                    arrs.append(tmp);
                }
                else
                {
                    for (int i=0;i<tmparrs1.length();i++)
                    {                
                        tmparrs1.at(i).insertAt(0,arr.first());
                    }
                    arrs.append(tmparrs1);                    
                }
                AcArray<T> tmparrs2 = combination(cdr,m);
                if (!tmparrs2.isEmpty())
                {
                    arrs.append(tmparrs2);
                }                        
            }
            return arrs;
        }
    
        //全部组合函数模板(1 2 3) => (1) (2) (3) (1 2) (1 3) (2 3) (1 2 3)
        template <class T>
        static AcArray<T> combination(T arr)
        {    
            AcArray<T> arrs;        
            for (int i=1;i<=arr.length();i++)
            {
                //调用递归
                AcArray<T> tempArray =combination(arr,i);
                arrs.append(tempArray);            
            }
            return arrs;
        }

    注意:第二个依赖第一个函数.

    使用实例

    使用AcGeIntArray做示例,只要是使用AcArray构成的类型,都可以.比如arx自带的AcDbObjectArray,自己使用AcArray定义的类型都可以...

            //此处使用ARX自带的AcGeIntArray做示例
            AcGeIntArray a;
            //第一种方式,
            AcArray<AcGeIntArray> arrs;
            //第二种方式,使用typedef定义一个类型别名
            //typedef AcArray<AcGeIntArray> AcGeIntArrays;
            //AcGeIntArrays arrs;
    
            //初始化数组
            for (int i=0;i<3;i++)
            {
                a.append(i+1);
            }
    
            //调用组合函数        
            arrs=combination(a);        
            //输出组合结果
            acutPrintf(_T("
    组合结果
    "));
            for (int i=0;i<arrs.length();i++)
            {
                AcGeIntArray tmp=arrs.at(i);
                for (int j=0;j<tmp.length();j++)
                {
                    acutPrintf(_T("%d "),tmp.at(j));
                }
                acutPrintf(_T("
    "));
            }

    组合函数结果图

  • 相关阅读:
    C#获取网页内容的三种方式
    C#,COM口,接收,发送数据
    mysql查询当前正在使用数据库
    错误日志中关于innodb的问题收集
    Oracle10g下载地址--多平台下的32位和64位
    Linux-PAM认证模块
    kali安装vmware tools
    redis数据库
    mysql的innodb中事务日志ib_logfile
    MySQL数据故障时备份与恢复
  • 原文地址:https://www.cnblogs.com/edata/p/14403502.html
Copyright © 2011-2022 走看看