在学习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怎么样?如果我必须使用指针...任何提示?
答案 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并且不会复制字符串数据。