2011-05-12 103 views
5

我將如何重寫下面的代碼,例如,使用沒有循環的STL算法?循環使用指針重寫使用STL算法,沒有循環的示例?

vector<double> pizzaBox; 
int biggestSlice = 0; 
for (int* p = &pizzaBox[0]; p != pizzaBox[pizzaBox.size()]; p++) { 
    if(*p > biggestSlice) 
     biggestSlice = *p; 
} 
+0

這個特定的算法,或者一般的任何循環? – 2011-05-12 12:45:58

+1

你應該迭代vector,而不是底層數組:'for(vector :: iterator p = pizzaBox.begin(); p!= pizzaBox.end(); ++ p)'。這將適用於任何類型的容器(列表,地圖,hash_map),而不僅僅是矢量。你所做的是種保證工作(因爲矢量需要存儲在連續的內存塊中),但是在形式上是未定義的。 – 2011-05-12 12:49:34

+1

注意:'pizzaBox [pizzaBox.size()]'實際上是未定義的行爲。您正在訪問超出數組末尾的元素。如果你使用'pizzaBox.at(pizzaBox.size())',它會拋出異常。 – 2011-05-12 12:54:42

回答

14

假設你實際上意味着vector<int>和糾正你的循環結束條件後,就可以使用max_element算法在這裏:

int biggestSlice = *max_element(pizzaBox.begin(), pizzaBox.end()); 

(注意:max_element返回迭代,因此我m在分配到biggestSlice之前對其返回值進行解引用。)

這當然不再有效(=產生未定義的行爲我們)何時矢量是空的。您需要在取消引用該函數的返回值之前,明確地測試

+5

'if(!pizzaBox.empty())',但然後提問者的代碼有同樣的問題。 – 2011-05-12 12:39:08

+0

@Steve有效評論。 – 2011-05-12 12:42:16

+2

@Steve Jessop:即使使用非空向量,OP問題也存在這個問題。 – 2011-05-12 12:56:03