【发布时间】:2011-05-12 12:33:25
【问题描述】:
我将如何重写下面的代码,例如,使用没有循环的 STL 算法?
vector<double> pizzaBox;
int biggestSlice = 0;
for (int* p = &pizzaBox[0]; p != pizzaBox[pizzaBox.size()]; p++) {
if(*p > biggestSlice)
biggestSlice = *p;
}
【问题讨论】:
-
这个特定的算法,还是任何一般的循环?
-
您应该迭代向量,而不是底层数组:
for (vector<double>::iterator p = pizzaBox.begin(); p != pizzaBox.end(); ++p)。这适用于任何类型的容器(列表、地图、hash_map),而不仅仅是向量。你所做的可以保证工作(因为向量需要将元素存储在连续的内存块中),但形式上是未定义的。 -
注意:
pizzaBox[pizzaBox.size()]实际上是未定义的行为。您正在访问超出数组末尾的元素。如果你使用pizzaBox.at(pizzaBox.size()),它会抛出异常。 -
您的中间条件在
!=之后缺少地址 (&) 运算符。但正如 Jan Hudec 所建议的那样,无论如何都应该使用迭代器来完成。
标签: c++ algorithm loops stl for-loop