2014-09-01 21 views
4

我不知道如果这个问题让太多的感觉,所以我会尽量表现为例:在C++中有从不同的内存位置打印char *的方法吗?

想象我在内存位置&s(NOT NULL终止)和另一个字符串串在内存位置z (空终止)。

char s[4]; s[0] = 'a'; s[1] = 'a'; s[2] = 'a'; s[3] = 'a'; 
char *z = malloc(sizeof(char) * 4); 
z[0] = 'a'; z[1] = 'a'; z[2] = 'a'; z[3] = '\0'; 
char *y = malloc(sizeof(char) * 4); 
y[0] = 'a'; y[1] = 'a'; y[2] = 'a'; y[3] = '\0'; 

有代表一个字符串,u的方式,那就是sz串联和另一个字符串,v,那就是sy串联无需复制s

我知道它的读取速度不会很快,但它肯定会节省更多的内存,尤其是重复次数。由于s的值可能与zy分开更改,并且更改应该出现在zv中,如果可能,无需克隆s肯定会更有效。

+1

是的,但你必须创建自己的类来管理字符串中的这些“跳跃”。 – Overv 2014-09-01 15:06:30

+1

您是否在制作嵌入式系统的程序,如果没有,则忘记内存使用情况。 – Alker 2014-09-01 15:06:41

+2

顺便说一句,'malloc'比C++更C ...... – Jarod42 2014-09-01 15:19:14

回答

7

你想要(或者我认为你想要的)结构的标准名称是rope - 它就像是一个具有统一接口的字符串的复合序列。

This other question关于绳索有一些他们的讨论,并链接到SGI扩展。

如果你拿起现有的实现,检查子串的可变性是否按照你想要的方式工作 - 有些人可能会实现写入时复制。

+0

+1我忘了那个名字。此外,一个特里可以工作在通用前缀的情况下(就像这里,如果我理解正确的话)。 – 2014-09-01 15:24:40

+0

作为第二个想法,或许trie不是最好的解决方案:它通常用于使用字符串作为键(访问实际值所必需的)。 – 2014-09-01 15:28:56

+1

我收回我以前的评论,然后:) – Useless 2014-09-01 15:52:30

1

有没有标准的方式来做你想做的。你必须创建自己的类来表示这样的字符串。也许它会包含类似vector<pair<char*, size_t>>的东西来表示字符串由数据组成的块。

+0

但是这不会容易阅读正确吗?这不像我可以在矢量上使用printf。 与此同时,这可能是解决这个问题的最好方法。 – 2014-09-01 15:20:47

+0

@RahulManne如果你关心可读性和字符串不是很长,那么你应该真的去重复,避免不必要的复杂性 – 2014-09-01 15:22:28

+0

有一个完美的标准和完备的数据结构,它只是不包括在STL。 – Useless 2014-09-01 15:25:15

1

您的问题的标题暗示您要打印此连接的字符串。如果这是唯一的用例,则可以使用writeviovec。其概念是您可以使用一个命令从多个数据源批量写入文件描述符。只需使用writev并写入stdout即可。