我过去并没有非常使用C++,并且最近做了很多C#,我真的很难再次回到C++的基础知识.这是特别棘手的,因为工作要求不能使用最方便的C++构造,因此所有字符串必须是char*,并且没有STL列表的规定.
我目前正在尝试做的是创建一个字符串列表,这将使我没有时间使用STL或C#.基本上我想要一个如下功能:
char **registeredNames = new char*[numberOfNames];
然后,
RegisterName(const * char const name, const int length) { //loop to see if name already registered snipped if(notFound) { registeredNames[lastIndex++] = name; } }
或者,如果它是C#...
if(!registeredNames.Contains(name)) { registeredNames.Add(name); }
我意识到它不起作用.我知道传递的变量(一个const指针和一个const字符串)的const性质使它相当困难,但我的基本问题是我以前总是通过使用STL列表等避免这种情况所以我从来没有不得不解决它!
我很抱歉发布这样一个微不足道的问题,任何帮助都将非常感谢!
干杯,
XAN
我可能会因为这个答案而被投票拒绝,因为这不是一个真正的答案,但有合法的理由可以避免STL.当在内存或速度非常高的固定环境中工作时,有时很难通过STL判断引擎的情况.是的,您可以编写自己的内存分配器,是的,速度通常不是问题,但跨平台的STL实现之间存在差异,并且这些差异会变得微妙且可能有问题.在考虑使用它时,记忆可能是我最关心的问题.我也为一家游戏公司工作,并且已经有很长一段时间了.记忆是珍贵的,我们如何使用它需要得到严格控制.除非你走这条路,否则这个概念可能没有意义,但这是真的.我们允许在工具(游戏代码之外)中使用STL,但在实际游戏中禁止使用它.另一个相关问题是代码大小.我稍微不确定STL可以为可执行文件大小做出多少贡献,但我们已经看到使用STL时代码大小明显增加.即使你的可执行文件"仅"大2M,你的游戏也会减少2M的RAM.
STL很好.但是,那些不知道自己在做什么的程序员可能会滥用它.这不是故意的,但是当你不想看到它们时它会提供令人讨厌的惊喜(再次,内存臃肿和性能问题)
我相信你已经接近你的解决方案了.
for ( i = 0; i < lastIndex; i++ ) { if ( !strcmp(®isteredNames[i], name ) { break; // name was found } } if ( i == lastIndex ) { // name was not found in the registeredNames list registeredNames[lastIndex++] = strdup(name); }
您可能不想使用strdup.这只是一个如何在给出示例的情况下存储名称的示例.您可能希望确保自己不想为新名称分配空间,或者使用可能已在应用程序中可用的其他内存构造.
请不要写一个字符串类.我举起字符串类可能是如何不在C++中重新设计基本C构造的最糟糕的例子.是的,字符串类可以隐藏许多漂亮的细节,但它的内存使用模式很糟糕,而且它们不适合控制台(即ps3或360等)环境.大约8年前,我们做了同一时间.在我们点击主菜单之前,有200000多个内存分配.内存非常分散,我们无法让其他游戏适应固定环境.我们最终把它撕掉了.
类设计对某些事情很有用,但这不是其中之一.这是一种观点,但它基于现实世界的经验.
你可能需要使用strcmp来查看字符串是否已经存储:
for (int index=0; index<=lastIndex; index++) { if (strcmp(registeredNames[index], name) == 0) { return; // Already registered } }
然后,如果你真的需要存储字符串的副本,那么你需要分配一个缓冲区并复制字符.
char* nameCopy = malloc(length+1); strcpy(nameCopy, name); registeredNames[lastIndex++] = nameCopy;
您没有提到您的输入是否为NULL终止 - 如果没有,则需要格外小心,并且strcmp/strcpy不合适.
如果可移植性存在问题,您可能需要查看STLport.