C++ 使用STL算法重写指针的循环示例,没有循环?

C++ 使用STL算法重写指针的循环示例,没有循环?,c++,algorithm,loops,stl,for-loop,C++,Algorithm,Loops,Stl,For Loop,例如,我如何重写下面的代码,使用没有循环的STL算法 vector<double> pizzaBox; int biggestSlice = 0; for (int* p = &pizzaBox[0]; p != pizzaBox[pizzaBox.size()]; p++) { if(*p > biggestSlice) biggestSlice = *p; } 矢量比萨饼盒; int biggestSlice=0; for(int*p=&p

例如,我如何重写下面的代码,使用没有循环的STL算法

vector<double> pizzaBox;
int biggestSlice = 0;
for (int* p = &pizzaBox[0]; p != pizzaBox[pizzaBox.size()]; p++) {
    if(*p > biggestSlice)
        biggestSlice = *p;
}
矢量比萨饼盒;
int biggestSlice=0;
for(int*p=&pizzaBox[0];p!=pizzaBox[pizzaBox.size()];p++){
如果(*p>biggestSlice)
最大切片=*p;
}

假设您实际上指的是
向量
,在更正循环结束条件后,您可以在此处使用算法:

int biggestSlice = *max_element(pizzaBox.begin(), pizzaBox.end());
(请注意,
max_element
返回一个迭代器,因此在分配给
biggestSlice
之前,我将取消对返回值的引用)


当向量为空时,这当然不再有效(=产生未定义的行为)。在取消引用函数的返回值之前,您需要对此进行显式测试。

如果(!pizzaBox.empty())
,那么提问者的代码也有同样的问题。@Steve Jessop:OP问题即使是非空向量也有这个问题。@Steve,@Konrad:注意,问题出在取消引用上;
max_元素
将愉快地处理空集合,返回end。此特定算法,或任何一般循环?您应该迭代向量,而不是底层数组:
for(vector::iterator p=pizzaBox.begin();p!=pizzaBox.end();++p)
。这将适用于任何类型的容器(列表、映射、哈希映射),而不仅仅是向量。您所做的某种程度上是保证工作的(因为在连续的内存块中存储元素需要向量),但形式上是未定义的。注意:
pizzaBox[pizzaBox.size()]
实际上是未定义的行为。您正在访问数组末尾以外的元素。如果使用
pizzaBox.at(pizzaBox.size())
它将引发异常。中间条件在
之后缺少(
&
)运算符的地址=。但正如Jan Hudec所建议的,无论如何都应该使用迭代器。