2013-04-23 86 views
1

讓我通過代碼問我的問題:在指定POS複製的char *到的std :: string不分配新的對象

char* apples = "apples"; 
std::string str("I like ....."); 
// need to copy apples to str to have "I like apples", without creating new objects 

assign功能,但遺憾的是它似乎是不可能提供std::string offset

我不想分配新的對象,因爲這是低延遲並且經常是代碼的一部分。

upd錯誤我已經把5點以上,但我的意思是6點,以適應「蘋果」完美:)當然,如果字符串容量不夠,一些對象必須創建。在我的問題中,我認爲字符串容量就足夠了。

+0

你想做什麼?覆蓋字符串的尾巴,就像在我的回答中,或者將任意字符串追加到你的? – kassak 2013-04-23 07:37:57

+0

以及我需要覆蓋「....」。但是追加也會起作用。我可以'調整大小'原始字符串切割'...'然後附加... – javapowered 2013-04-23 07:40:03

+0

您是否打算在字符串中有六個點,以便可以在不調整字符串的情況下用「蘋果」覆蓋它們?事實上,如果要用六個字母替換五個點,字符串將需要增長。 – 2013-04-23 07:51:24

回答

1

爲什麼不使用std::string::replace

+0

如果它的工作,那麼問題是什麼更好'std :: copy'或'std :: string :: replace' – javapowered 2013-04-23 07:43:21

+0

@javapowered他們不會做同樣的事情。 – 2013-04-23 07:46:30

+0

@javapowered:'replace'確實(我想)你想要什麼,即使它們有不同的長度,用另一個字符串替換子字符串。 'copy'會覆蓋部分字符串,並且如果字符串不夠長(在你的例子中就是這種情況),會出現可怕的錯誤。 – 2013-04-23 07:48:57

5

您可以使用std::copy算法http://www.cplusplus.com/reference/algorithm/copy/

std::copy(apples, apples + sz, str.begin() + offset);

+0

OP所要做的是在不復制的情況下添加字符串,這是不可能的。 – 2013-04-23 07:35:15

+0

@IvayloStrandjev我想,他在談論重寫字符串的尾巴。我會問他澄清=) – kassak 2013-04-23 07:36:30

+0

@IvayloStrandjev我不想介紹「中間」的對象。例如我不想將'char * apples'轉換爲中間'std :: string'。相反,我想直接將字符串複製到'str',但我需要提供位置。我認爲卡斯克回答了我的問題。 – javapowered 2013-04-23 07:41:49

1

甚至可以指定將複製無論你傳遞給它的內容。你將無法做你想做的事。一個字符串持有一個指向內存中的字符塊的連續的塊。你不能把任意事情粘到它上面。

+0

我可以'複製'!這就是我想要做的。好吧,我的問題似乎太簡單了,我迷惑了人們。我想我應該使用'replace'。 – javapowered 2013-04-23 07:48:01

+1

@perreal它取決於。首先,標準對'std :: string'不做任何保證;一個符合的實現可以在任何時候調用一個非const函數來進行重新分配。如果您需要保證,請使用'std :: vector '。其次,至少在大多數情況下,我所見過的所有實現行爲或多或少都像'std :: vector '。 (例如,如果你在非常量字符串上使用'[]',g ++可能會重新分配,但是隻有第一次;在此之後,在容量超過之前不會再進行重新分配。) – 2013-04-23 07:49:52

+0

@JamesKanze,非常豐富 – perreal 2013-04-23 07:51:04

0

使用std::copy()算法的答案是AFAIK中最好的一個。你也可以使用普通的老C(你知道,它實際上不是C,空調風格將是一個更好的名字)來實現同樣的事情:

char* apples = "apples"; 
std::string str("I like ....."); 

char * ptr = apples; 
while(*ptr != 0) { 
    str.push_back(*ptr); 
    ++ptr; 
} 

正如你所看到的,有沒有臨時對象在這裏創建,但是......這是否意味着在這個過程中沒有分配?他們確實是。

A std::string基本上是一個字符向量。該字符串有一個capacity()方法,該方法返回可以追加多少額外字符而不觸發另一個分配(可能涉及重新分配,從而複製整個向量)。爲了避免分配,你可以做的最好的做法是確保字符串有足夠的空間供所有字符插入。

char* apples = "apples"; 
std::string str("I like ....."); 

str.reserve(str.length() + strlen(apples)); 

char * ptr = apples; 
while(*ptr != 0) { 
    str.push_back(*ptr); 
    ++ptr; 
} 

這種方式可以確保將只有在std::string一個分配:一個與reserve()觸發。

希望這會有所幫助。

0
char * apples = "apples"; 
string something = "I like ...."; 
    for (int i = 0; i < something.length() - 1; i++) 
    { 
     if (something.find('.')) 
      something.pop_back(); 
    } 
    something.resize(something.length() + 1); 
    for (int i = 0; i < strlen(apples); i++) 
     something.push_back(apples[i]); 
cout << something <<endl; 
相關問題