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

6

在学习 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个回答

6
无论 std::string 是否使用写时拷贝取决于实现(即标准库供应商决定)。然而,大多数 std::string 实现不会使用COW,这主要是因为大多数(如果不是全部)读操作都会强制复制 —— operator[] 返回一个引用,c_str()data() 返回一个指针。与之相比,QString::operator[] 返回一个代理对象。
尽管如上所述,除非你通过测量确定字符串拷贝是应用程序的瓶颈,否则不要使用指向 std::string 的指针。
此外,请注意,QString 存储 UTF-16 字符串,而 std::string 存储一系列 char —— QByteArray 是 Qt 中的等效类型。

7
自 C++11 起,不再允许 std::string 进行 COW(写时复制)操作,因为这会使迭代器失效。 - Yakov Galka

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

std::string 类定义了一个 = 运算符,形式如下:

string& operator= ( const string& str );

在这种情况下,应该调用复制构造函数而不是复制赋值运算符? - Sridhar Thiagarajan

2
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>();

1
如果你打算从函数返回std::string,那就不要使用指针 - 通过值返回。在这种情况下,很可能会应用返回值优化,字符串数据将不会被复制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接