2011-05-12 99 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