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

asd*_*cap 5 c++ qt pointers std

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

QString var1=QString("Hi there!");
QString var2=var1
Run Code Online (Sandbox Code Playgroud)

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

std::string var1=std::string()
Run Code Online (Sandbox Code Playgroud)

要么

std::string* var1=new std::string()
Run Code Online (Sandbox Code Playgroud)

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

ava*_*kar 6

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

尽管如此std::string,除非您确定(通过测量)字符串副本是应用程序中的瓶颈,否则不要使用指针.

另外,要注意QString存储UTF-16字符串,而std::string存储一系列chars - QByteArray将是Qt等价物.

  • std :: string不再允许执行COW(C++ 11),因为它会使迭代器无效. (6认同)