STL find函数在std::deque中的返回值类型及匹配问题咨询
理清std::deque中std::find的迭代器类型问题
我来帮你搞清楚这个困惑的核心点~
首先要明确一个关键规则:std::find返回的迭代器类型,和你传入的起始、结束迭代器类型完全一致。你的代码问题就出在这上面:
为什么第一行代码能正常运行?
你用了dataCellHandleArray.cbegin()和dataCellHandleArray.cend(),这两个方法返回的是const迭代器(std::deque<DataCellHandle>::const_iterator)。而你用来接收的std::_Deque_iterator<DataCellHandle, const DataCellHandle&, const DataCellHandle*>,其实就是const_iterator的底层实现别名,类型完全匹配,所以编译没问题。
为什么第二行代码无法运行?
你试图把std::find返回的const迭代器,赋值给非const的std::deque<DataCellHandle>::iterator——这两种迭代器类型是不兼容的!因为const迭代器的设计目的是禁止修改指向的元素,而非const迭代器允许修改,编译器会阻止这种可能破坏const语义的赋值,所以编译报错。
解决方法分两种情况:
- 如果不需要修改找到的元素,就用const迭代器接收:
std::deque<DataCellHandle>::const_iterator itr = std::find(dataCellHandleArray.cbegin(), dataCellHandleArray.cend(), releaseHandle); - 如果需要修改找到的元素,就换成非const的起始/结束迭代器:
std::deque<DataCellHandle>::iterator itr = std::find(dataCellHandleArray.begin(), dataCellHandleArray.end(), releaseHandle);
关于你提到的“预期返回索引”的补充:
std::find确实返回的是迭代器而非索引,如果需要获取元素在deque中的位置,可以用std::distance计算:
// 假设itr是合法的迭代器(不是end()) size_t index = std::distance(dataCellHandleArray.begin(), itr);
因为std::deque的迭代器是随机访问迭代器,所以这个计算是O(1)时间复杂度,不用担心效率问题。
内容的提问来源于stack exchange,提问作者Marko Bencik
相关产品推荐
相关产品推荐

