2011-07-06 33 views
5

當從const char*構建std::string,我經常使用以下模式:正確的成語的std :: string分配

const char* p = GetString(); 
std::string s(p); 

我想我可以用類似的模式:

const char* p = GetString(); 
std::string s = p; 

但,當我想從const char*分配而不是構建std::string時,我的選擇太多了:

s = p; 
s.assign(p); 
std::string(p).swap(s); 

上面的選擇或多或少是等價的嗎?我應該選擇哪一個,爲什麼?

回答

8

爲了便於閱讀,請使用慣用的operator=進行分配。另外,直接從const char*構建std::string

std::string s(GetString()); 
s = GetString(); 
+3

首選s = GetString();因爲這沒有機會給你一個意外的功能(最痛苦的解析 - http://en.wikipedia.org/wiki/Most_vexing_parse) – dascandy

1

前兩個基本上是一樣的東西; assign有幾個重載,讓你做有趣的事情。我會選擇直接的=,因爲它更清晰。

最後一個看起來非常冗長和非直觀;我不知道爲什麼你會那樣做(除非你絕望地回收s正在使用的內存)。

2

operator =和.assign幾乎完全相同,您應該更喜歡operator = form,因爲它更具可讀性。

最後一個是不一樣的。交換內容確實減少了構建給定對象所花費的時間,因爲它不創建副本,它僅移動內容。你的語法首先將p複製到一個std :: string中,然後用s替換它,由於你仍然在複製p,所以它不比其他表現更好。如果P是一個std :: string的字符串,那麼它會更快。

3

通常情況下,你只是做

std::string s = GetString();

對於分配,做

s = GetString();

這意味着std::string對象具有可用於生成最快操作的最大信息。

相關問題