首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不带<string>和STL的C++字符串

不带<string>和STL的C++字符串
EN

Stack Overflow用户
提问于 2008-09-18 11:19:38
回答 13查看 5.5K关注 0票数 5

我过去不太使用C++,最近做了很多C#,我真的很难再回到C++的基础上来。这是特别棘手的,因为工作要求不能使用任何最方便的C++构造,因此所有字符串都必须是char *,并且没有提供STL列表。

我现在要做的就是创建一个字符串列表,使用STL或者C#来做这件事不会花费我任何时间。基本上,我想要有一个函数,例如:

代码语言:javascript
复制
char **registeredNames = new char*[numberOfNames];

然后,

代码语言:javascript
复制
RegisterName(const * char const name, const int length)
{
    //loop to see if name already registered snipped
    if(notFound)
    {
        registeredNames[lastIndex++] = name;
    }

}

或者,如果是C#..。

代码语言:javascript
复制
if(!registeredNames.Contains(name))
{
    registeredNames.Add(name);
}

我意识到它不起作用。我知道传递的变量的常量性质(常量指针和常量字符串)使它变得相当困难,但我的基本问题是,我过去总是通过使用STL列表等来避免这种情况,所以我从来没有绕过它!

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2008-09-18 11:28:58

您可能需要使用strcmp来查看字符串是否已经存储:

代码语言:javascript
复制
for (int index=0; index<=lastIndex; index++)
{
  if (strcmp(registeredNames[index], name) == 0)
  {
    return; // Already registered
  }
}

然后,如果您确实需要存储字符串的副本,则需要分配一个缓冲区并复制字符。

代码语言:javascript
复制
char* nameCopy = malloc(length+1);
strcpy(nameCopy, name);
registeredNames[lastIndex++] = nameCopy;

您没有提到您的输入是否以NULL结尾-如果不是,则需要格外小心,并且strcmp/strcpy将不适用。

票数 6
EN

Stack Overflow用户

发布于 2008-09-18 12:17:24

可以避免使用STL是有正当理由的。当在内存或速度非常重要的固定环境中工作时,使用STL有时很难知道幕后发生了什么。是的,你可以编写自己的内存分配器,是的,速度通常不是问题,但跨平台的STL实现之间存在差异,这些差异可能是微妙的和潜在的but。在考虑使用内存时,内存可能是我最关心的问题。

内存是宝贵的,我们如何使用它需要严格控制。除非你曾经走过这条路,否则这个概念可能没有意义,但它是真的。我们确实允许在工具中使用STL (在游戏代码之外),但在实际游戏中是被禁止的。另一个相关的问题是代码大小。我不太确定STL对可执行文件的大小有多大的贡献,但我们已经看到使用STL时代码大小的显著增加。即使你的可执行文件“只”大了2M,你的游戏的其他东西的RAM也减少了2M。

STL当然很好。但它可能会被不知道自己在做什么的程序员滥用。这不是故意的,但当你不想看到它们时,它会带来令人不快的惊喜(同样,内存膨胀和性能问题)

我相信你已经接近你的解决方案了。

代码语言:javascript
复制
for ( i = 0; i < lastIndex; i++ ) {
    if ( !strcmp(&registeredNames[i], name ) {
        break;    // name was found
    }
}
if ( i == lastIndex ) {
    // name was not found in the registeredNames list
    registeredNames[lastIndex++] = strdup(name);
}

您可能不想使用strdup。这只是一个如何存储给定示例的名称的示例。您可能希望确保自己不想为新名称分配空间,或者使用应用程序中可能已有的其他内存结构。

请不要写字符串类。我曾经举过string类作为如何不在C++中重新设计基本C结构的最糟糕的例子。是的,string类可以对你隐藏许多漂亮的细节,但它的内存使用模式很糟糕,而且不适合控制台(例如ps3或360等)环境。大约8年前,我们做了同样的事情。200000+内存分配在我们进入主菜单之前。内存非常零散,我们无法让游戏的其余部分适应固定的环境。我们最终把它拆掉了。

类设计在某些方面很棒,但这不是其中之一。这只是一个观点,但它是基于现实世界的经验。

票数 7
EN

Stack Overflow用户

发布于 2008-09-18 11:46:40

如果可移植性是个问题,您可能需要查看STLport

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/91715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档