2011-04-12 243 views
0

據我瞭解,如果我不存儲指針,C++中的所有內容都會被複制,這可能導致性能不佳(忽略我的示例的簡單性)。所以我想我把我的對象存儲爲我的向量中的指針而不是字符串對象,這對性能更好嗎? (假設我有很長的字符串和很多)。C++向量和指針

當我嘗試遍歷我的字符串指針的向量的問題是我不能從中提取的實際值

string test = "my-name"; 
vector<string*> names(20); 
names.push_back(&test); 

vector<string*>::iterator iterator = names.begin(); 
while (iterator != names.end()) 
{ 
    std::cout << (*iterator) << ":" << std::endl; 
    // std::cout << *(*iterator); // fails 

    iterator++; 
} 

見註釋行,我沒有問題,在接受字符串指針。但是,當我嘗試獲取字符串指針值我得到一個錯誤(我找不到什麼興奮的錯誤是,但程序只是失敗)。

我也嘗試存儲(迭代器)在一個新的字符串變量,但它沒有幫助?

+0

@mads失敗?有例外嗎?不編譯?測試仍在範圍內? – Lou 2011-04-12 15:51:30

+0

空指針和指向本地作用域變量的指針?難怪你有問題得到它們指向的實際值 – 2011-04-12 15:54:43

+0

你是否對你的代碼進行了剖析並證明這是一個嚴重的問題?還是你在微觀優化prematureley? – 2011-04-12 15:57:25

回答

5

您已創建矢量並將其初始化爲包含20個項目。這些項目正在被默認初始化,這在指針的情況下是空指針。該程序無法取消引用這些空指針。

一個建議是不要擔心什麼是最有效的,直到你有一個演示的問題。這個代碼當然會更好用vector<string>vector<string*>

+0

謝謝,當你把頭圍繞在它身上時,這很有意義:) – 2011-04-12 16:04:15

0

你的代碼看起來像你正在將一個指向基於棧的變量的指針存儲到一個向量中。只要聲明你的字符串的函數返回,那個字符串就變成垃圾,指針也是無效的。如果要將指針存儲到向量中,則可能需要動態分配字符串(使用新的)。

0

有一個在你的初始化:

string test = "my-name"; 
vector<string*> names(20); 
names.push_back(&test); 

首先創建一個std::vector 20元。

然後您使用push_back附加第21個元素,該元素指向有效的string。這很好,但是這個元素在循環中永遠不會到達:第一次迭代已經崩潰了,因爲存儲在向量中的前20個指針並不指向有效的string s。

解引用無效指針會導致崩潰。如果你確定你的向量中有一個有效的指針,**iterator就可以很好地訪問一個元素。

0

嘗試

if (*iterator) 
{ 
    std::cout << *(*iterator) << ":" << std::endl; 
} 

馬克贖金解釋了爲什麼一些指針現在

1

不,不,一千個不。

不要過早優化。如果程序速度很快,則無需擔心性能。在這種情況下,由於每個對象只是單個指針的目標,所以指針會消耗內存和時間,從而明顯降低性能!

更不用說手動指針編程往往會引入錯誤,特別是對於新手。犧牲性能的正確性和穩定性是向後退步的一大步。

C++的優勢在於它通過提供封裝的數據結構和算法簡化了優化過程。因此,當您決定進行優化時,通常可以通過交換標準零件來實現。

如果您想了解優化數據結構,請閱讀smart pointers

這可能是你想要的程序:

vector<string> names(20, "my-name"); 

for (vector<string>::iterator iterator = names.begin(); 
     iterator != names.end(); 
     ++ iterator) 
{ 
    std::cout << *iterator << '\n'; 
} 
0
string test = "my-name"; 
vector<string*> names(20); 

載體的size是20,這意味着它可以容納20個字符串指針。

names.push_back(&test); 

隨着push_back操作,離開了第一個20個元件和添加新的元件來保持的test地址的矢量。前20個矢量元素未初始化,可能指向垃圾。並且while循環一直運行到大小爲21的向量的末尾,並且取消引用未初始化的指針就是導致問題的原因。由於vector的尺寸可以通過push_back操作動態增加,因此不需要明確提及尺寸。

vector<string*> names; // Not explicitly mentioning the size and the rest of 
         // the program should work as expected.