2012-04-29 94 views
6

如何做一個std::vector<std::string>初始化自身時,下面的代碼調用std :: vector的拷貝構造函數是如何操作的?

std::vector<std::string> original; 
std::vector<std::string> newVector = original; 

這似乎好像拷貝構造函數將在std::vector<std::string> new期間newVector = original被調用,卻怎麼也帶來了內部的std::stringorginal?他們是複製品還是新的std::stringnewVector[0]中的內存也與original[0]相同。

的原因,我問的是說我做了以下

#include <vector> 
#include <string> 
using namespace std; 

vector<string> globalVector; 

void Initialize() { 
    globalVector.push_back("One"); 
    globalVector.push_back("Two"); 
} 

void DoStuff() { 
    vector<string> t = globalVector; 
} 

int main(void) { 
    Initialize(); 
    DoStuff(); 
} 

t就會掉出來的DoStuff範圍(在非優化的版本),但如果它t只是充滿指針指向std::string「 s在globalVector,可能會調用析構函數並將std::string中使用的內存刪除,這裏用於填充globalVector[0]的垃圾std::stringDoStuff被調用後?

堅果殼,我基本上是問,當std::vector的拷貝構造函數被調用時,裏面的元素是如何被複制的?

+4

很確定這只是一個例子,但在你的第一個代碼塊中,'std :: vector new = original;','new'不是合法的變量名。我相信你知道這是一個保留關鍵字。 – 2012-04-29 00:12:21

+0

@ChrisA .:你說得對,它只是測試代碼 – chadb 2012-04-29 00:41:23

回答

12

std::vector和大多數其他標準庫容器按值存儲元素。元素在插入或複製容器時被複制。 std::string也保留其自己的數據副本,就您的使用而言。

+3

其中大部分==全部。 – 2012-04-29 00:10:15

+2

@BenjaminLindley:就貨櫃的使用者而言,你是對的。然而,正如你最可能知道的那樣,Stroustrup提醒我們一些容器,比如'std :: string',可能會懶惰地複製數據,這意味着實際的複製操作可能不會在內部完成,直到其中一個字符串(原始或該副本)的使用方式要求完成。無論如何,我認爲在這種情況下,回答者在技術上是正確的,尤其是在他以合格的方式說出他的用法。 – thb 2012-04-29 00:18:20

+2

@thb'std :: string'只是一個容器的排序,它僅限於「類字符類型」(即不能存儲其他容器),並且在多線程流行的時候不推薦使用寫時複製。 – Potatoswatter 2012-04-29 00:25:58