2014-09-01 19 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即可。