[英]Vector iterator incompatible ? Same vector
我有以下代码
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval)
{
vector<Interval> res;
vector<Interval>::iterator it;
for (it = intervals.begin(); it != intervals.end(); it++)
{
if (newInterval.start < (*it).start)
{
intervals.insert(it, newInterval);
break;
}
}
if (it == intervals.end()) //---->vector iterator incompatible
{
intervals.insert(it, newInterval);
}
}
我在语句中收到向量迭代器不兼容的错误
if (it == intervals.end()) //---->vector iterator incompatible
{
intervals.insert(it, newInterval);
}
任何人都可以澄清为什么会发生这种情况以及我该如何解决这个问题? 即使不调用 insert 也会发生这种情况。 这是我得到的错误
用insert
使迭代器失效(对于vector来说,一个插入可能会导致memory重新分配,所有元素都被移动到一个新的地址。迭代器只是一个指针,所以不能用来和一个vector的新端进行比较,这是没有意义的),正如评论所提到的,您需要将返回值重新分配给it
的值。 或者只是使用std::find_if
简化代码,最好使用 STL 算法而不是手写循环。 使代码更清晰、更易于维护。
#include <algorithm>
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
vector<Interval> res;
if (auto itr = std::find_if(intervals.begin(), intervals.end(),
[&newInterval](const Interval& val) {
return newInterval.start < val.start;
});
itr != intervals.end()) {
intervals.insert(itr, std::move(newInterval));
} else {
intervals.push_back(std::move(newInterval));
}
// omitted
return res;
}
或者只是简化为:
#include <algorithm>
vector<Interval> insert2(vector<Interval>& intervals, Interval newInterval) {
vector<Interval> res;
auto itr = std::find_if(intervals.begin(), intervals.end(),
[&newInterval](const Interval& val) {
return newInterval.start < val.start;
});
intervals.insert(itr, std::move(newInterval));
// omitted
return res;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.