gpt4 book ai didi

C++ 迭代器作为 lambda 函数中的参数,断言失败 : "vector iterators incompatible"

转载 作者:行者123 更新时间:2023-11-30 01:38:54 25 4
gpt4 key购买 nike

在使用迭代器作为参数调用 lambda 函数后,我遇到了一个奇怪的行为。它会产生断言失败“vector 迭代器不兼容”。

我的代码看起来像这样:

std::vector<LAYOUT> Layouts;
// fill vector...
auto it = Layouts.begin();
while (it != Layouts.end()) {
// do something...
auto fn= [Layouts] (auto i) -> void {
while (i != Layouts.end()) { // <- ASSERTION RAISED HERE
// do something...
i++;
}
};
fn(it);
it++;
}

断言是在vector.h中提出的

void std::_Vector_const_iterator<_Myvec>::_Compat(const _Myiter& _Right) const {
// test for compatible iterator pair
if (this->_Getcont() != _Right._Getcont()) {
_DEBUG_ERROR("vector iterators incompatible");
_SCL_SECURE_INVALID_ARGUMENT;
}
}

问题是为什么会这样?

最佳答案

我花了一些时间才找到真正的问题所在。解决方案很简单:Layouts 未在捕获子句中作为引用传递。因此首先生成了该 vector 的拷贝。然后可以清楚地理解 Layouts.end() 迭代器不再与在 lambda 函数中作为参数给出的原始 vector 迭代器兼容。

解决方案是在捕获子句中添加引用运算符(&)。

auto fn= [&Layouts] (auto i) -> void {
while (i != Layouts.end()) {
// do something...
i++;
}
};

关于C++ 迭代器作为 lambda 函数中的参数,断言失败 : "vector iterators incompatible",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46955829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com