向量迭代器不兼容?相同的向量

问题描述

我有以下代码

 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 也会发生这种情况。这是我得到的错误

enter image description here

解决方法

迭代器用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;
}