[英]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.