今天早上提出的这个问题使我想知道C ++标准库中缺less哪些function,以及如何用封装function填补空白。 例如,我自己的实用程序库有这个向量附加function: template <class T> std::vector<T> & operator += ( std::vector<T> & v1, const std::vector <T> & v2 ) { v1.insert( v1.end(), v2.begin(), v2.end() ); return v1; } 这个清除(或多或less)任何types – 特别是像std :: stack: template <class C> void Clear( C & c ) { c = C(); } 我还有几个,但是我对你使用哪一个感兴趣? 请限制封装函数的答案 – 即不超过几行代码。
我有一个自定义的容器类,我想写的iterator和const_iterator类。 我从来没有这样做,我没有find一个合适的方法。 关于迭代器创build的准则是什么?我应该注意什么? 我也想避免代码重复(我觉得const_iterator和iterator共享很多东西;一个子类应该是另一个?)。 脚注:我非常确定,Boost有一些可以缓解这个问题的方法,但是由于许多愚蠢的原因,我无法在这里使用它。
是否有可能在Visual Studiodebugging器中查看数组? QuickWatch只显示数组的第一个元素。
有没有任何简单的LINQexpression式来连接我的整个List<string>集合项目与一个带有分隔符字符的单个string ? 如果集合是自定义对象而不是string呢? 想象一下,我需要连接在object.Name 。
我正在尝试为我的Ubuntu机器上的Raspberry Pi进行交叉编译。 在我最初的尝试中,我使用的是arm-linux-gnueabi编译器,它在Ubuntu的repo中可用。 我得到了这个工作。 我能够build立我所有的依赖关系,并在我的cmake项目中使用交叉编译器。 但是,我相信我应该使用hf版本,所以我切换到arm-linux-gnueabihf。 然后我意识到,这不适用于Raspberry Pi,因为它是armv6。 谷歌search后,我find了GitHub的预build工具链: https : //github.com/raspberrypi/tools 。 我下载了工具链,但是我不太懂得如何“安装”它。 我将这些文件解压到我的主目录。 目录结构如下所示: /gcc-linearo-arm-linux-gnueabihf-raspbian /arm-linux-gnueabihf /bin (contains g++, gcc, etc) /lib (contains libstdc++ library) /bin (contains arm-linux-gnueabihf-g++, arm-linux-gnueabihf-…) /lib (gcc lib stuff) 如果将目录更改为INNER bin文件夹,我可以从terminal编译testing程序,而不会出现任何问题。 ~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/ arm-linux-gnueabihf/bin$ g++ test.cpp -o test 然后,我试图在OUTER bin文件夹中编译一个testing程序,其中包含工具的前缀版本。 ~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin$ arm-linux-gnueabihf-g++ test.cpp -o test 但是,当我尝试使用编译器(从内部bin目录之外)时,无法find工具链附带的libstdc ++共享库: arm-linux-gnueabihf-gcc: error while […]
什么是堆栈展开? 通过search,但没有find启发的答案!
就像我喜欢C和C ++一样,我忍不住用零结尾的string来select我的头: 在C之前存在长度前缀(即Pascal)string 通过允许恒定的时间长度查找,长度前缀string使得几个algorithm更快。 带有前缀长度的string使得导致缓冲区溢出错误变得更加困难。 即使在32位机器上,如果允许string为可用内存的大小,则长度前缀string比空string只有三个字节。 在16位机器上,这是一个字节。 在64位机器上,4GB是一个合理的string长度限制,但即使您想将其扩展到机器字的大小,64位机器通常也有充足的内存,使得额外的七个字节sorting为空参数。 我知道最初的C标准是为疯狂的穷人机器(内存)编写的,但效率的论点在这里并不卖我。 几乎所有其他语言(即Perl,Pascal,Python,Java,C#等)都使用长度前缀string。 这些语言通常在string处理基准testing中胜过C,因为它们对string更高效。 C ++用std::basic_string模板纠正了这个问题,但是普通的字符数组需要null结尾的string仍然普遍。 这也是不完善的,因为它需要堆分配。 空终止的string必须保留一个不能存在于string中的字符(即null),而长度前缀string可以包含embedded的空值。 这些事情中有几个比C更早出现,所以C不知道它们是有意义的。 然而,在C成立之前,有好几个都很清楚。 为什么会selectnull终止的string,而不是明显优越的长度前缀? 编辑 :因为有些人在我的效率点上面提出了一些事实 (而且不喜欢那些我已经提供的),他们来自于一些事情: 使用空string的Concat需要O(n + m)时间复杂度。 长度前缀通常只需要O(m)。 使用空字符结束的string的长度需要O(n)时间复杂度。 长度前缀是O(1)。 长度和concat是迄今为止最常见的string操作。 有几种情况,以空字符结束的string可以更有效,但是这种情况发生得less得多。 从下面的答案,这些是一些情况下,空string更有效: 当你需要中断一个string的开始,并且需要将它传递给某种方法。 即使允许销毁原始string,也不能在长度为前缀的情况下实时执行此操作,因为长度前缀可能需要遵循alignment规则。 在某些情况下,你只是逐个字符地循环,你可能会保存一个CPU寄存器。 请注意,这只适用于你没有dynamic分配string的情况(因为那么你必须释放它,因此必须使用你保存的CPU寄存器来保存你最初从malloc和朋友那里得到的指针)。 以上都不是长度和连续的一样普遍。 下面的答案还有一个说法: 你需要切断string的结尾 但是这个是不正确的 – 对于以空字符结尾和长度为前缀的string,这是相同的时间量。 (空终止的string只是在你想要新结束的地方贴上一个null,长度前缀只是从前缀中减去)。
我是新来的multithreading,并试图了解互斥体如何工作。 有很多谷歌search, 我find了一个体面的教程 ,但它仍然留下了一些工作,因为我创build了自己的程序,其中locking不起作用的怀疑。 一个绝对不直观的互斥语法是pthread_mutex_lock( &mutex1 ); ,它看起来像互斥体被locking,当我真正想locking的是其他一些variables。 这个语法是否意味着locking一个互斥锁,locking一段代码,直到互斥锁被解锁? 那么线程怎么知道这个区域被locking? [ 更新:线程通过 内存屏蔽 知道该区域被locking ]。 而不是这样的现象应该被称为临界区? [ 更新:临界区对象仅在Windows中可用,其中对象比互斥体快,只有实现它的线程才可见。 否则,关键部分只是指由互斥体保护的代码区域 ] 简而言之,能否请您介绍一下最简单的互斥示例程序以及关于它如何工作的逻辑的最简单可能的解释 ? 我相信这会帮助其他许多新手。
我为一家技术公司工作,该公司比产品发货做更多的原型。 我刚刚被问到C#和F#之间有什么区别,为什么MS创buildF#和什么情况会比C#更好。 我已经使用了一段时间的语言,我喜欢它,所以我可以轻松地继续关于F#的伟大function,但是我缺乏C#的经验来说明为什么我们应该使用它。 使用C#vs F#或F#vs C#有什么好处?
一个非常简单的问题。 为什么在第一个while循环中跳过scanf? 我已经通过使用getchar()来尝试它,结果是一样的。 getchar被跳过。 如果你们不明白我在说什么,你可以尝试编译它,你们会明白我在问什么。 #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct rec{ int num; char pref[16]; float point; struct rec* next; }rec; void dataInput(float*,char*); rec* insertNode(rec*); int main(){ int i=1; rec* entr,*pt = NULL; entr = (rec*) malloc(sizeof(rec)); entr->num = i; dataInput(&entr->point,entr->pref); entr->next = NULL; char key; i++; while(1){ printf("Continue ? If YES […]