【问题标题】:Can I use std::max_element() on std::deque in c++11?我可以在 c++11 中的 std::deque 上使用 std::max_element() 吗?
【发布时间】:2017-10-17 10:12:31
【问题描述】:

我可以像std::max_element(std::begin(my_deque), std::end(my_deque)) 这样编码吗?

我之所以问,是因为我知道 deque 不能保证连续存储,所以我想知道在使用像 std::max_element 这样的涉及迭代器的函数时它是否会正确运行?

非常感谢!

【问题讨论】:

  • 他们的规范只需要class ForwardIt,所以这应该适用于任何实现前向迭代的集合。它根本与连续存储无关。
  • std::max_elements 只需要前向迭代器,请参阅:en.cppreference.com/w/cpp/algorithm/max_element
  • max_element 只要求迭代器是 ForwardIterator。它不需要随机访问/数据连续性
  • 使用迭代器而不是指针的全部意义在于让这种东西工作。
  • 迭代器实际上还有第二点:不编译不能工作的代码。 std::sort 将无法编译,如果你传递 Forward Iterators。

标签: c++ c++11 std deque


【解决方案1】:

std::max_element 的签名格式为

template<class ForwardIterator>
ForwardIterator max_element(ForwardIterator first, ForwardIterator last);

从模板类型名称我们知道它需要一个前向迭代器。根据 [container.requirements.general]-Table 96,我们知道 std::deque 使用

任何满足前向迭代器要求的迭代器类别

因此,由于它使用前向迭代器或更好的迭代器,它总是没问题的。

【讨论】:

    【解决方案2】:

    是的,它会正常工作。在这种情况下将调用的std::max_element 的重载是

    template< class ForwardIt > 
    ForwardIt max_element(ForwardIt first, ForwardIt last);
    

    对迭代器的唯一要求是

    first, last - 定义要检查的范围的前向迭代器

    所以对随机访问迭代器没有要求,只有转发迭代器。

    【讨论】:

    • 你说得对 max_element 只需要前向迭代器,但似乎对 std::deque 迭代器的类别有些混淆(它们是随机访问的)。拥有随机访问迭代器并不意味着连续存储。
    猜你喜欢
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    相关资源
    最近更新 更多