Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 允许用户在内部实现链表的同时与std::strings交互?_C++_String_List - Fatal编程技术网

C++ 允许用户在内部实现链表的同时与std::strings交互?

C++ 允许用户在内部实现链表的同时与std::strings交互?,c++,string,list,C++,String,List,我正在为我的游戏创建一个文本框。我使用的引擎中大多数与字符串相关的函数都使用std::string*或std::string& 以下是一些限制条件: 我的Gui API的其余部分为getText()函数返回std::string&因此我需要能够为文本返回std::string 我使用std::string实现了文本框,并生成了一行字符串。问题是它的速度太慢,文本太多,所以我想使用一个字符串作为列表。不过,我认为由于缓存的原因,渲染速度会变慢。如何在能够提供std::string和看似连续的字符流

我正在为我的游戏创建一个文本框。我使用的引擎中大多数与字符串相关的函数都使用std::string*或std::string&

以下是一些限制条件:

我的Gui API的其余部分为getText()函数返回std::string&因此我需要能够为文本返回std::string

我使用std::string实现了文本框,并生成了一行字符串。问题是它的速度太慢,文本太多,所以我想使用一个字符串作为列表。不过,我认为由于缓存的原因,渲染速度会变慢。如何在能够提供std::string和看似连续的字符流的同时实现具有快速插入/删除功能的string类


谢谢

不幸的是,你真的不能;
std::string
类需要具有连续存储,以便
data
成员函数能够正常工作。如果您想在编辑器缓冲区中使用更快速的字符串表示形式,例如,a,则必须让函数返回不同类型的内容。

从给出的细节很难判断。我猜你(重新)创建了太多的字符串副本,可能一次又一次地传递新对象,等等

提前为
std::string
预留更多空间也会有所帮助。在不知道任何实际代码的情况下很难判断


另外,您确定您的代码由于字符串处理而变慢吗?或者,您是在每帧逐字符重新创建/绘制整个文本?您可能希望尝试在纹理中缓存最终文本或缓存“绘图说明”(即使用顶点缓冲区对象或简单数组保存字符位置)并仅在更改时更新这些内容。

编辑:我没有仔细阅读您的问题。忽略以下内容(对不起)

从std::string继承是没有用的(即使可以,实现细节也会使您丧命)。如果您真的想这样做,您必须创建一个ABC,它提供与std::string相同的接口(然后可能提供一个从它继承的类,将所有对它的调用重定向到内部std::string),将当前代码中对std::string的所有引用更改为新类的引用,然后创建另一个包含特殊字符串的类

或者,您可以使用模板和专门化实现相同的目的,并避免虚拟调用的开销

简而言之,除非通过tostdstring方法或其他方法动态构造字符串,否则无法真正提供std::string

原因如下:第三方库和应用程序中对std::string和std::wstring进行了特殊处理,链接器更喜欢使用例程的MSVCP80/90.DLL版本,而不是重写。通过在std::string和std::wstring的typedefs名称之上提供替代实现,您违反了一个定义规则。随后将出现许多混乱

在理想情况下,您可以选择在API中完全使用另一种类型,该类型可以理解“字符串”的非连续结构,并且该类型在语法上可以与std::string的200多个成员函数兼容。它可以使用整个连续字符串的延迟构造,直到调用.data()或.c_str()将其传递给使用char*指针的其他API函数。在这个理想的世界中,您可以重新编译接口中碰巧包含std::string的每一段代码


在现实世界中,您需要更改GUI API界面以了解字符串列表类型。

一些代码片段或更多详细信息如何?我猜你不是在使用很长的文本,就是在做错事(一遍又一遍地复制字符串?)。嗯。。。最近我似乎对你的一些问题发表了评论,免责声明:我没有跟踪你!现在,在C++0x中,您的语句是正确的,
std::string
需要连续存储,但在当前的标准中,情况并非如此。在C++03中,一个符合标准的实现可以使用rope(我想一些人几年前就这样做了)@davidrodriguez-Yup,这是完全正确的。我误读了规范。我会尽快删除这篇文章。我不认为你真的需要删除这篇文章(我认为你甚至不能接受它)。事实上,所有当前的实现都有连续存储,而新标准将需要它,因此,即使需要一个技术上不精确的存储,从技术角度来看,答案是好的(即用have替换required使其正确)。此外,这是唯一一个能在游戏中使用绳子的答案,这也是我投票支持它的原因。更好的解决方案:如果OP不能改变正确答案,请编辑你的答案使其正确。