【问题标题】:Example of loop using pointers rewritten using an STL algorithm, without a loop?使用 STL 算法重写的指针的循环示例,没有循环?
【发布时间】: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&lt;double&gt;::iterator p = pizzaBox.begin(); p != pizzaBox.end(); ++p)。这适用于任何类型的容器(列表、地图、hash_map),而不仅仅是向量。你所做的可以保证工作(因为向量需要将元素存储在连续的内存块中),但形式上是未定义的。
  • 注意:pizzaBox[pizzaBox.size()] 实际上是未定义的行为。您正在访问超出数组末尾的元素。如果你使用pizzaBox.at(pizzaBox.size()),它会抛出异常。
  • 您的中间条件在 != 之后缺少地址 (&amp;) 运算符。但正如 Jan Hudec 所建议的那样,无论如何都应该使用迭代器来完成。

标签: c++ algorithm loops stl for-loop


【解决方案1】:

假设您实际上是指vector&lt;int&gt;,并且在更正循环结束条件后,您可以在此处使用max_element 算法:

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

(注意max_element 返回一个迭代器,因此我在分配给biggestSlice 之前取消引用返回值。)

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

【讨论】:

  • if (!pizzaBox.empty()),但是提问者的代码也有同样的问题。
  • @Steve Jessop:即使使用非空向量,OP 问题也存在这个问题。
  • @Steve, @Konrad:注意,有问题的是取消引用; max_element 将愉快地处理空集合,返回结束。
猜你喜欢
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多