2011-10-30 54 views
3

在學習C++,我第一次使用Qt庫,而不是標準C++的,STL和所有的(好了,我是新與C++和被Qt寵壞了)。對QT,QString的使用隱含共享,從而使我把剛纔複製它分配給像另一個變量:我應該使用指針的std :: string

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

這將很好地做沒有太多的開銷。但現在,我想要的std :: string的話,我應該做的

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

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

並且還,怎麼樣QVector和std ::向量。如果我必須使用指針...任何提示?

回答

5

無論std::string使用寫入時複製依賴於實現(即你的標準庫的供應商決定)。然而,大多數std::string實現不會用牛,主要是由於這樣的事實,如果不是所有的讀操作迫使副本 - operator[]返回一個參考,c_str()data()返回一個指針。與QString::operator[]比較,它返回一個代理對象。

儘管如上,不要使用指向std::string的指針,除非您確定(通過測量)字符串副本是應用程序中的瓶頸。

此外,提防QString存儲UTF-16的字符串,而std::string商店char秒的序列 - QByteArray將Qt的等效。

+6

的std :: string是不允許做COW了(C++ 11),因爲它會使無效迭代器。 – ybungalobill

+0

@ybungalobill,很高興知道,謝謝! – avakar

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

std::string類具有定義爲=操作:

string& operator= (const string& str); 
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>(); 
1

如果你打算從函數返回std::string那麼就不要使用指針 - 回報按價值。在這種情況下,最有可能Return Value Optimization將應用和字符串數據將不會被複制。

相關問題