问题描述
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,插入可能导致内存重新分配,所有元素都移动到新地址。迭代器只是一个指针,所以不能用来比较对于向量的新结尾,它毫无意义),正如评论中提到的,您需要将返回值重新分配给 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(),[&newInterval](const Interval& val) {
return newInterval.start < val.start;
});
intervals.insert(itr,std::move(newInterval));
// omitted
return res;
}