这个能简化代码?每次个函数都要js判断对象是否为空 cpp这个对象

(点击上方公众号,可快速关注)英文: cs.clemson.edu译者: 伯乐在线 - 周昌鸿 网址: /67880/点击“阅读原文”,加入伯乐在线作者团队1. 记住阿姆达尔定律funccost是函数func运行时间百分比,funcspeedup是你优化函数的运行的系数。所以,如果你优化了函数TriangleIntersect执行40%的运行时间,使它运行快了近两倍,而你的程序会运行快25%。这意味着不经常使用的代码不需要做较多优化考虑(或者完全不优化)。这里有句俗语:让经常执行的路径运行更加高效,而运行稀少的路径正确运行。2. 代码先保证正确,然后再考虑优化这并不意味着用8周时间写一个全功能的射线追踪算法,然后用8周时间去优化它。分多步来做性能优化。先写正确的代码,当你意识到这个函数可能会被经常调用,进行明显的优化。然后再寻找算法的瓶颈,并解决(通过优化或者改进算法)。通常,改进算法能显著地改进瓶颈——也许是采用一个你还没有预想到的方法。所有频繁调用的函数,都需要优化。3. 我所了解的那些写出非常高效代码的人说,他们优化代码的时间,是写代码时间的两倍。4.跳转和分支执行代价高,如果可能,尽量少用。函数调用需要两次跳转,外加栈内存操作。优先使用迭代而不是递归。使用内联函数处理短小的函数来消除函数调用开销。将循环内的函数调用移动到循环外(例如,将for(i=0;i&100;i++) DoSomething();改为DoSomething() { for(i=0;i&100;i++) { … }})。if…else if…else if…else if…很长的分支链执行到最后的分支需要很多的跳转。如果可能,将其转换为一个switch声明语句,编译器有时候会将其转换为一个表查询单次跳转。如果switch声明不可行,将最常见的场景放在if分支链的最前面。5. 仔细思考函数下标的顺序两阶或更高阶的数组在内存中还是以一维的方式在存储在内存中,这意味着(对于C/C++数组)array[i][j] 和 array[i][j+1]是相邻的,但是array[i][j] 和array[i+1][j]可能相距很远。以适当的方式访问存储实际内存中的数据,可以显著地提升你代码的执行效率(有时候可以提升一个数量级甚至更多)。现代处理器从主内存中加载数据到处理器cache,会加载比单个值更多的数据。该操作会获取请求数据和相邻数据(一个cache行大小)的整块数据。这意味着,一旦array[i][j]已经在处理器cache中,array[i][j+1]很大可能也已经在cache中了,而array[i+1][j]可能还在内存中。6. 使用指令层的并行机制尽管许多程序还是依赖单线程的执行,现代处理器在单核中也提供了不少的并行性。例如:单个CPU可以同时执行4个浮点数乘,等待4个内存请求并执行一个分支预判。为了最大化利用这种并行性,代码块(在跳转之间的)需要足够的独立指令来允许处理器被充分利用。考虑展开循环来改进这一点。这也是使用内联函数的一个好理由。7. 避免或减少使用本地变量。本地变量通常都存储在栈上。不过如果数量比较少,它们可以存储在CPU寄存器中。在这种情况下,函数不但得到了更快访问存储在寄存器中的数据的好处,也避免了初始化一个栈帧的开销。不要将大量数据转换为全局变量。8. 减少函数参数的个数。和减少使用本地变量的理由一样——它们也是存放在栈上。9. 通过引用传递结构体而不是传值我在射线追踪中还找不到一个场景需要将结构体使用传值方式(包括一些简单结构如:Vector,Point和Color)。10. 如果你的函数不需要返回值,不要定义一个。11. 尽量避免数据转换。整数和浮点数指令通常操作不同的寄存器,所以转换需要进行一次拷贝操作。短整型(char和short)仍然使用一整个寄存器,并且它们需要被填充为32/64位,然后在存储回内存时需要再次转换为小字节(不过,这个开销一定比一个更大的数据类型的内存开销要多一点)。12. 定义C++对象时需要注意。使用类初始化而不是使用赋值(Color c(black); 比C c =更快)13. 使类构造函数尽可能轻量。尤其是常用的简单类型(比如,color,vector,point等等),这些类经常被复制。这些默认构造函数通常都是在隐式执行的,这或许不是你所期望的。使用类初始化列表(Use Color::Color() : r(0), g(0), b(0) {},而不是初始化函数Color::Color() { r= g = b = 0; } .)14. 如果可以的话,使用位移操作&&和&&来代替整数乘除法15. 小心使用表查找函数许多人都鼓励将复杂的函数(比如:三角函数)转化为使用预编译的查找表。对于射线追踪功能来说,这通常导致了不必要的内存查找,这很昂贵(并不断增长),并且这和计算一个三角函数并从内存中获取值一样快(尤其你考虑到三角查找打乱了cpu的cache存取)。在其他情况下,查找表会很有用。对于GPU编程通常优先使用表查找而不是复杂函数。16. 对大多数类,优先使用+= 、 -= 、 *= 和 /=,而不是使用+ 、 - 、 * 、 和?/这些简单操作需要创建一个匿名临时中间变量。例如:Vector v = Vector(1,0,0) + Vector(0,1,0) + Vector(0,0,1);?创建了五个匿名临时Vector: Vector(1,0,0), Vector(0,1,0), Vector(0,0,1), Vector(1,0,0) + Vector(0,1,0), 和 Vector(1,0,0) + Vector(0,1,0) + Vector(0,0,1).对上述代码进行简单转换:Vector v(1,0,0); v+= Vector(0,1,0); v+= Vector(0,0,1);仅仅创建了两个临时Vector: Vector(0,1,0) 和 Vector(0,0,1)。这节约了6次函数调用(3次构造函数和3次析构函数)。17. 对于基本数据类型,优先使用+?、?-?、?*?、?和?/,而不是+=?、?-=?、?*= 和 /=18. 推迟定义本地变量定义一个对象变量通常需要调用一次函数(构造函数)。如果一个变量只在某些情况下需要(例如在一个if声明语句内),仅在其需要的时候定义,这样,构造函数仅在其被使用的时候调用。19. 对于对象,使用前缀操作符(++obj),而不是后缀操作符(obj++)这在你的射线追踪算法中可能不是一个问题使用后缀操作符需要执行一次对象拷贝(这也导致了额外的构造和析构函数调用),而前缀的构造函数不需要一个临时的拷贝。20. 小心使用模板对不同的是实例实现进行不同的优化。标准模板库已经经过良好的优化,不过我建议你在实现一个交互式射线追踪算法时避免使用它。使用自己的实现,你知道它如何使用算法,所以你知道如何最有效的实现它。最重要的是,我的经历告诉我:调试STL库非常低效。通常这也不是一个问题,除非你使用debug版本做性能分析。你会发现STL的构造函数,迭代器和其他一些操作,占用了你15%的运行时间,这会导致你分析性能输出更加费劲。21. 避免在计算时进行动态内存分配动态内存对于存储场景和运行期间其他数据都很有用。但是,在许多(大多数)的系统动态内存分配需要获取控制访问分配器的锁。对于多线程应用程序,现实中使用动态内存由于额外的处理器导致了性能下降,因为需要等待分配器锁和释放内存。即便对于单线程应用,在堆上分配内存也比在栈上分配内存开销大得多。操作系统还需要执行一些操作来计算并找到适合尺寸的内存块。22. 找到你系统内存cache的信息并利用它们如果一个是数据结构正好适合一个cache行,处理整个类从内存中只需要做一次获取操作。确保所有的数据结构都是cache行大小对齐(如果你的数据结构和一个cache行大小都是128字节,仍有可能因为你的结构体中的一个字节在一个cache行中,而其他127字节在另外一个cahce行中)。23. 避免不需要的数据初始化如果你需要初始化一大段的内存,考虑使用memset。24. 尽早结束循环和尽早返回函数调用考虑一个射线和三角形交叉,通常的情况是射线会越过三角,所以这里可以优化。如果你决定将射线和三角面板交叉。如果射线和面板交叉t值是负数,你可以立即返回。这允许你跳过射线三角交叉一大半的质心坐标计算。这是一个大的节约,一旦你知道这个交叉不存在,你就应该立即返回交叉计算函数。同样的,一些循环也应该尽早结束。例如,当设置阴影射线,对于近处的交叉通常都是不必须的,一旦有类似的的交叉,交叉计算就应该尽早返回。(这里的交叉含义不太明白,可能是专业词汇,译者注)25. 在稿纸上简化你的方程式许多方程式中,通常都可以或者在某些条件中取消计算。编译器不能发现这些简化,但是你可以。取消一个内部循环的一些昂贵操作可以抵消你在其他地方的好几天的优化工作。26. 整数、定点数、32位浮点数和64位双精度数字的数学运算差异,没有你想象的那么大在现代CPU,浮点数运算和整数运算差不多拥有同样的效率。在计算密集型应用(比如射线追踪),这意味这可以忽略整数和浮点数计算的开销差异。这也就是说,你不必要对算数进行整数处理优化。双精度浮点数运算也不比单精度浮点数运算更慢,尤其是在64位机器上。我在同一台机器测试射线追踪算法全部使用double比全部使用floats运行有时候更快,反过来测试也看到了一样的现象(这里的原文是:I have seen ray tracers run faster using all doubles than all floats on the same machine. I have also seen the reverse)。27. 不断改进你的数学计算,以消除昂贵的操作sqrt()经常可以被优化掉,尤其是在比较两个值的平方根是否一致时。如果你重复地需要处理 除x 操作,考虑计算1/x的值,乘以它。这在向量规范化(3次除法)运算中赢得了大的改进,不过我最近发现也有点难以确定的。不过,这仍然有所改进,如果你要进行三次或更多除法运算。如果你在执行一个循环,那些在循环中执行不发生变化的部分,确保提取到循环外部。考虑看看你的计算值是否可以在循环中修改得到(而不每次都重新开始循环计算)。CPP开发者微信号:cppFans打造东半球最好的 C 和 C++ 微信号--------------------------------------商务合作QQ:投稿网址:点击“阅读原文”,申请加入伯乐在线作者团队。↓↓↓CPP开发者(cppFans) 
 文章为作者独立观点,不代表微头条立场
的最新文章
本文精选了「CPP 开发者」9月份的 15 篇热门文章。其中有技术分享、技术资源。本文介绍了C++ 时间戳转化的原理及实现方法。树作为一种数据结构我们经常会用到,作为起步和基础,我们先来实现二叉树,也就是每个节点有不超过2个子节点的树。对于树的操作,最基本的创建、遍历、求树高、节点数等这篇文章推荐了包括技术、设计和极客相关的热门公众号。C++ 程序经常因为未定义行为而出现各种千奇百怪的 Bug,调试起来也十分困难。这篇文章推荐了包括技术、设计和极客相关的热门公众号。有人先在 Twitter 发了一条推,号称 「C++ 砖家建议」:
#define private public
然后随着扩散和转发,越来越多丧心病狂的邪恶建议介绍一下多线程编程的两个基础:互斥和信号量C语言中缺少相应的字符串处理函数,如果想要实现某个字符串功能,只能靠我们自己来实现。但是当来到C++中,字符串的处理就会变得异常简单。今天我们就来学习一下C++中最高频的字符串处理函数。来自 Quora 的一个讨论帖,题主说了:如果是单行代码,必须是那种实用的,不是混淆或令人费解的那种。比如:while (*n++=*i++)......(← 看懂的童鞋可在评论中解释)我想再找些更为复杂的程序这篇文章推荐了包括技术、设计和极客相关的热门公众号。在伯乐小组的这个讨论帖《你见过或写过的最复杂的 C 语言程序是?》中,就提到了「平方根倒数速算法」中的神奇数字 0x5f3759df。Christian 在本文中探讨了该算法诸多有趣的地方本文站在作者学习和实践重构的基础上,为大家梳理重构技术,带领大家重新认识重构的目标和起点,重构手法背后的原理以及实践方式。最后介绍在实践中高效实施C/C++重构的经验、技巧和工具。本节是个人对重构手法的整理和提炼,帮助大家跳出细节,快速掌握重要的重构手法并且能够尽快在自己的重构实践中进行使用.随后我们整理了重构手法应用顺序的背后思想,帮助大家避免死记硬背,可以根据自己的重构场景推导出合理的重构顺序.自1985年由Bjarne Stroustrup在贝尔实验室发明以来,C++作为一门系统级语言,早已超越一门之前,多线程一些基本的东西,包括线程创建,互斥锁,信号量,我们都已经封装,下面来看看消息队列本节针对C++语言,总结了一些对实施重构非常有用的工程实践经验. 当然其中决大部分也适用于C语言开发.以前一直都是用pthread的API写C++的多线程程序。虽然很早之前就听说,从C++11开始,标准库里已经包含了对线程的支持,不过一直没有拿来用,最近刚好有空,借着pthread的经验学习下std::thread的用法输入输出流、文件流常用操作、总结、原理学过C++的人肯定会很熟悉STL标准模板库,STL其实就是封装了一系列的接口,供我们调用。很多函数或者算法的实现不需要我们从头开始写,大大提高我们的编程效率。这篇博客在简单介绍STL的情况下,会详细的来介绍vector的使用。这是C++11新特性介绍的第十部分,涉及到随机数库相关的新特性。这是C++11新特性介绍的第七部分,涉及到左右值引用、移动构造、移动赋值、完美转发等。这是C++11新特性介绍的第八部分,涉及到template相关的新特性。开发时经常会需查看非文本文件内容,最常见的16 进制查看器就是 hexdump。hexdump 看似简单,但还是有些小技巧的。这是C++11新特性介绍的第九部分,涉及到正则表达式相关的新特性。面向对象是一种编程思想,虽然C并没有提供面向对象的语法糖,但仍然可以用面向对象的思维来抽象和使用。这里分享一套C面向对象的写法,可以完成面向对象编程并进行流畅的抽象。这套写法是在实践中不断调整的结果,目前已经比较稳定,进行了大量的功能编写。OBB方向包围盒算法能够实现矩形旋转碰撞 。但这个算法扩展到3D层面会更加的复杂。相较而言射线检测算法,是一个比较简单清晰的思路,实现起来复杂度也不高,碰撞点也容易获得,扩展到3D世界依然有效。本文精选了 CPP 开发者 8月份的 10 篇热门文章。其中有技术分享、技术资源。如果不用循环、递归、goto,我如何才能用 C++ 从 1 打印到 100 ?叉查找树相比于其他数据结构在查找、插入的时间复杂度上有很大的优势。通过这4 张 GIF 图帮助你理解二叉查找树版本控制已经出现有些年头了。然而,我还是会被人问起一些,诸如版本控制是什么或者它是如何工作的,这样基础的问题。本文会概括地解释版本控制解决的重要问题,本文使用的场景针对的是源代码版本控制。强制代码审查已经有很长时间了,看似快要胜利,但团队中还是有抵触的声音,那我们为什么要进行代码审查和如何进行代码审查如果你能认识到这样的事实:我们大部分的时间都消耗在维护自己写的可怕的代码上,你就会发现,让代码最少、少给自己找麻烦,这无疑就会变成一个相当有创意的好思想。社交网络中,好友推荐随处可见,这里探讨好友推荐是如何做的。这是C++11新特性介绍的第六部分,涉及到 Class 的相关内容。Copy-on-write 是一种很重要的优化手段。它的核心思想是懒惰处理多个实体的资源请求,在多个实体之间共享某些资源,直到有实体需要对资源进行修改时,才真正为该实体分配私有的资源。本文主要总结一下 Linux 下 TCP/IP 网络编程中的 read/write 系统调用的行为。在实际的项目中,当项目的代码量不断增加的时候,你会发现越来越难管理和跟踪其各个组件,如其不善,很容易就引入BUG。因此,我们应该掌握一些能让我们程序更加健壮的方法。说到代码混淆艺术,大家可能会想到 IOCCC 大赛中的阿卡林形象。不过本文介绍 Andy Sloane 的一个只有 462 字节的程序,用 C 代码实现雅虎 logo ACSII 动图。文中包含了详细解释。说到代码混淆艺术,大家可能会想到 IOCCC 大赛中的阿卡林作品。不过本文介绍 Andy Sloane 的一个作品:C 代码实现雅虎 logo ACSII 动图。我很喜欢 C++11 的智能指针。在很多时候,对很多讨厌自己管理内存的人来说是天赐的礼物。用 C++11 两年多了,我无意中发现多种错误使用智能指针的案例,这些错误会使程序效率很低或者直接崩溃。从协议结构、协议举例等方面简单的介绍了一下HTTP协议本文首先提出平台相关代码造成的两个问题,然后针对这两个问题循序渐进依次提出解决方案,在分析了前两个方案弱点的基础上,最后着重介绍一种基于多种设计模式的 Linux 平台相关代码的解决方案,并给出此方案的 C++ 实现。这是 GNU grep 的原作者 Mike Haertel 在 FreeBSD 邮件列表中对 “GNU grep 为什么比 BSD grep 要快” 所做的回答,涉及到几个技巧。无锁哈希表(Lock-Free Hash Table )可以提高多线程下的性能表现,但是因为实现一个无锁哈希表本身的复杂度不小,在这里我将分享我实现的这个版本。我想与你分享一些最重要的技巧,它们可以帮助你推动你的生产力,提升你的总产量,而且可能最重要的,使你空闲出时间从事其它的活动。除多年编程经验之外和编程技巧,还有哪些事情是高级程序员都会去做的字符串匹配是计算机的基本任务之一。通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件。其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码;而.h文件则被称作C++头文件,里面放的也是C++的源代码。类中函数的深度探索cppFans关注 C 和 C++ 啦热门文章最新文章cppFans关注 C 和 C++ 啦对c++文件流结束判断eof()函数的疑惑! -CPP- TryCatch
>> Content
对c++文件流结束判断eof()函数的疑惑!
#include&&iostream&#include&fstream&using&namespace&int&main()&{ofstream&ofs("a.txt");int&n&=&10;while&(--n)&ofs&&n&&"\t";ofs&&ofs.close();int&&x,y&=&0,&z&=&0;ifstream&ifs("a.txt");&while&(!ifs.eof())&{ifs&&x;&&&&&&&&&&&++z;&&&&&&&&&&&&&&&cout&&x&&"\t"&&&&&问题在这里,文件流已经结束了,怎么还要循环一次呢?}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&上面写入到文件里面的是9&8&7&6&5&4&3&2&1,读出来怎么变成了cout&&ifs.close();&&&&&&&&&&&&9&8&7&6&5&4&3&2&1&1了呢?多循环了一次呀!!}
------Solutions------
没有多循环,我单步走了一下,x=0的时候,输出9,x=9时候,输出8&......当x=2时,输出1,当为1时,还是输出1.
------Solutions------
while&(!ifs.eof())&{&ifs&&x;&&&&&&&&&&++z;&&&&&&&&&&&&&&cout&&&x&&&"\t"&&&//&&问题在这里,文件流已经结束了,怎么还要循环一次呢?&}&&&改成while&(true)&{&ifs&&x;&&if(ifs.eof())&//在这里检测……&&&&&&&&++z;&&&&&&&&&&&&&&cout&&&x&&&"\t"&&&&}&&&
------Solutions------
http://topic.csdn.net/u//a6-4de6-ae1c-01ad7e4a41cf.html可以参考此帖……
------Solutions------
在使用C/C++读文件的时候,一定都使用过eof()这个函数来判断文件是否为空或者是否读到文件结尾了,也会在使用这个函数的过程中遇到一些问题,如不能准确的判断是否为空或者是否到了文件尾,以至于有些人可能还会怀疑这个函数是不是本身在设计上就有问题。先来看看如下这段代码:#include&&iostream&#include&&fstream&using&namespace&int&main(){&&char&ch&=&'x';&&ifstream&fin("test.txt"&/*,&ios::binary*/);&&if&(fin.eof())&&{&&&&cout&&&&"file&is&empty."&&&&&&return&0;&&}&&while&(!fin.eof())&&{&&&&fin.get(ch);&&&&cout&&&&&&}&&&&&&system("pause");&&return&0;}编译并运行以上代码,如果test.txt不存在,程序会形成死循环,fin.eof()永远返回false,如果test.txt为空,程序打印出一个x字符,当test.txt中存在一字符串“abcd”且没有换行时,程序打印出“abcdd”,当存在以上字符串并且有一新的空行时,程序打印出“abcd”加上一空行。这种现象可能让很多人很迷惑,程序运行的结果似乎很不稳定,时对时错。使用binary模式读时结果一样。在这里,大家可能有一个误区,认为eof()返回true时是读到文件的最后一个字符,其实不然,eof()返回true时是读到文件结束符0xFF,而文件结束符是最后一个字符的下一个字符。如下图所示:因此,当读到最后一个字符时,程序会多读一次(编译器会让指针停留在最后一个字符那里,然后重复读取一次,这也就是就上面最后一个字符会输出两次的原因。至于是不是所有的编译器都这样处理我就不太清楚了,我使用的VC6,VC8似乎都是这样的)问题出来了,就要找出对应的解决之道,要解决以上的问题,只需要调整一下条件语句即可:&&&&&&&&&&&&&&&&&&&&&&&&&&fin.peek()&==&EOF&&&或&&&fin.get(ch)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&再来看一下另外一种情况:#include&&iostream&#include&&fstream&#include&&string&using&namespace&int&main(){&string&&ifstream&fin("test.txt"/*,&ios::binary*/);&if&(fin.peek()&==&EOF)&{&&cout&&&&"file&is&empty."&&&&return&0;&}&while&(!fin.eof())&{&&fin&&&&&&cout&&&&&}&&&&&system("pause");&return&0;}上述代码在VC8下编译运行,发现,当文件结尾没有空行时,结果正确,当结尾有空行时,最后一个字符串将被重复输出一次,&而VC6的情况则有所不同,没有重复输出,但输出了一个空行。因此,为了保证在不同的编译器下得到一致的我们期望的结果,将条件语句做一下修改:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&fin&&&&str&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&综上所述,我们可以得到以下结论:1.&判断文件是否为空时使用peek函数,若peek返回EOF则文件为空;2.&读取文件过程中,读取非char型时,使用peek判断文件尾将不再适用,循环判断条件应改用&&操作符进行读取,若读入char型缓冲区,peek函数会表现得很好。
------Solutions------
学习了&eof
------Solutions------
平时做的一些笔记,楼主可参考下。使用eof()的情况:Stu&stu2;infile.read((char*)&stu2,sizeof(Stu));while(!infile.eof())&&{&&&&&stu2.show();&&&&&&&&&&infile.read((char*)&stu2,sizeof(Stu));&&}使用peek()的情况:while(infile.peek()!=EOF)&&{&&&&&infile.read((char*)&stu2,sizeof(Stu));&&&&&&&&&&stu2.show();&&&&&&&&}
------Solutions------
#include&&iostream&&#include&&fstream&&using&namespace&&int&main()&{&ofstream&ofs("moweinian.txt");&int&n&=&10;&while&(--n)&ofs&&&n&&&"\t";&ofs&&&&ofs.close();&char&x;&&&&&&//这里ifstream&ifs("moweinian.txt");&while&(!ifs.eof())&{&ifs.get(x);&&&&&&&&&&//这样就可以了&&&&&&&&&&&&cout&&&x&&&&//问题在这里,文件流已经结束了,怎么还要循环一次呢?&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&上面写入到文件里面的是9&8&7&6&5&4&3&2&1,读出来怎么变成了&cout&&&&ifs.close();&&&&&&&&&&//&&9&8&7&6&5&4&3&2&1&1了呢?多循环了一次呀!!return&0;&}&
------Solutions------
谢谢了,我已经明白了!因为在那个txt文件里面最后还有东西,也就是说除了内容以外还有换行、空格什么的,所以有多循环了一次,又因为这些东西不能复制给int型数据所以ifs&&x,没有执行成功,又重新执行了一次上次的输出!!不知道说的有没有道理!!!
------Solutions------
你显然说错了,4楼说的比较详细,不过关于最后一个字符为什么会输出两次的解释似乎不对。当输入流读到EOF时是不返回任何内容的,也就是说最后一次ifs&&x;&&&并不改变x的值(可以在每次ifs&&x;&之前给x赋一个值文件中没有的字符来确认ifs&&x是否改变x的值),这样x中保留的自然是上一次读入的值了一道计算机二级c++编程题,题上让打开文件中的其中一个.cpp完善一个函数,我填完后就直接链接了_百度知道

我要回帖

更多关于 jsoncpp 遍历对象 的文章

 

随机推荐