我应该使用指向std :: string的指针

时间:2011-10-30 15:01:29

标签: c++ qt pointers std

在学习c ++时,我首先使用Qt库而不是标准的C ++,STL和所有这些(好吧,所以我是c ++的新手,并被Qt宠坏了)。在Qt上,QString使用了隐式共享,因此我只需将其复制到另一个变量,如:

QString var1=QString("Hi there!");
QString var2=var1

如果没有太多开销,这样做会很好。但是现在,我正在尝试使用std :: string,我应该这样做

std::string var1=std::string()

std::string* var1=new std::string()

而且,QVector和std :: vector怎么样?如果我必须使用指针...任何提示?

4 个答案:

答案 0 :(得分:5)

std::string是否使用copy-on-write取决于实现(即标准库供应商决定)。但是,大多数std::string实现都不会使用COW,主要是因为大多数(如果不是全部)读取操作强制复制 - operator[]返回引用,c_str()和{{1}返回一个指针。将其与data()进行比较,后者返回一个代理对象。

尽管如此,请不要使用指向QString::operator[]的指针,除非您确定(通过测量)字符串副本是您应用程序中的瓶颈。

另外,请注意std::string存储UTF-16字符串,而QString存储一系列std::string s - QByteArray将是Qt等效字符。

答案 1 :(得分:2)

std::string var1("Hi there!");
std::string var2=var1; 

std::string 类的=运算符定义为:

string& operator= ( const string& str );

答案 2 :(得分:1)

std::string* var1=new std::string()

不要那样做。只要在可能的情况下通过引用传递它:

void f(const std::string& s); // no copying

如果您确实需要共享字符串,请使用:

std::shared_ptr<std::string> var1 = std::make_shared<std::string>();

答案 3 :(得分:1)

如果要从函数返回std::string,则不要使用指针 - 按值返回。在这种情况下,最有可能应用Return Value Optimization并且不会复制字符串数据。