2011-07-06 36 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对象具有可用于生成最快操作的最大信息。

相关问题