【问题标题】:What does the stl find function return from dequestl find函数从deque返回什么
【发布时间】:2019-07-30 09:15:12
【问题描述】:

我有一个标准双端队列并在其中搜索元素。我的问题是我不明白 find 函数返回什么样的形式。

std::deque< DataCellHandle > dataCellHandleArray;
std::_Deque_iterator<DataCellHandle, const DataCellHandle&, const DataCellHandle*> it =
    std::find( dataCellHandleArray.cbegin(), dataCellHandleArray.cend(), releaseHandle ); // works

std::deque< DataCellHandle >::iterator itr =
    std::find( dataCellHandleArray.cbegin(), dataCellHandleArray.cend(), releaseHandle ); // does not work

我预计将返回索引或迭代器。

【问题讨论】:

  • 不要触摸名称为 _Like _These 的类型。这些是标准库实现细节,不可移植。所有这些名称都是应用程序代码的禁区。
  • 我知道这不是最好的主意。我只是想表明我正在测试我的东西,但最终这是一个重大疏忽。

标签: c++ c++14 deque


【解决方案1】:

std::find 返回与 firstlast 参数类型相同的对象,在您的情况下是 std::deque&lt;DataCellHandle&gt;::const_iterator

【讨论】:

    【解决方案2】:

    std::find 的返回类型与您实例化此函数模板的迭代器的类型相同。在您的情况下,您传递dataCellHandleArray.cbegin().cend(),它们的类型为std::deque::const_iterator,而不是std::deque::iterator。因此,这是您的解决方案:

    std::deque<DataCellHandle>::const_iterator it = ...
    

    请注意,这是开箱即用的:

    auto it = std::find(dataCellHandleArray.cbegin(), dataCellHandleArray.cend(),
       releaseHandle);
    

    请注意,const_iterator 可以从 iterator 构造,但不能反过来。

    // Ok, iterator to const_iterator
    std::deque<DataCellHandle>::const_iterator ci = dataCellHandleArray.begin();
    
    // Ok, compare const_iterator and iterator:
    assert(ataCellHandleArray.begin() == ataCellHandleArray.cbegin());
    
    // Error, can't loose constness of the "pointee"
    std::deque<DataCellHandle>::iterator ci = dataCellHandleArray.cbegin();
    

    【讨论】:

    • 现在我知道我做了什么疏忽。感谢您的快速响应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多