c ++ stl vector iterator插入分段错误

时间:2013-02-21 22:38:37

标签: c++ vector iterator

          std::vector<struct::event>::iterator it;
          std::vector<struct::event>::iterator last=myvector.end();

          for (it=myvector.begin(); it<=last; it++){

            if(mysignal.declination<(*last).declination){

              if (mysignal.declination>=(*it).declination && mysignal.declination<(*(it+1)).declination){
                myvector.insert(it+1, mysignal);
                break;
              }
            }
            if (mysignal.declination>=(*last).declination){
              myvector.push_back(mysignal);
              break;
            }


            }

我有一个名为myvector的向量,其中包含使用偏角排序的事件。现在我想在正确的位置添加mysignal到这个向量。但是在一些事件之后我总是得到一个seg错误:if(mysignal.declination&lt;(* last).declination)。我只是看不出有什么问题。

3 个答案:

答案 0 :(得分:2)

您的循环错误,请阅读the docs

  

返回容器最后一个元素后面元素的迭代器。   该元素充当占位符;试图访问它会导致未定义的行为。

您无法取消引用end(),它提供了一种了解您已超出容器的方法,因此您的循环条件应为it != myvector.end(),而last也是错误的。

答案 1 :(得分:0)

end()不引用容器中的最后一个元素,需要按如下方式更改条件。

for (it=myvector.begin(); it != last; it++){

你还有其他破坏的逻辑,它取消引用你需要修复的最后一个。

答案 2 :(得分:0)

正如其他人所说,C ++迭代器定义了半开区间 ('[begin()...end())'),这应该是你应该做的 在大多数其他情况下使用。虽然它适用于 迭代器来自向量,通常,迭代器不支持 <=(也不是<);循环的标准习语是:

for ( auto current = container.begin();
        current != container.end();
        ++ current ) ...

(在最可能的情况下,你不能指望C ++ 11,你会 必须写出完整的迭代器类型,而不是使用 auto。虽然auto是C ++ 11中为数不多的东西之一 这似乎适用于最近版本的VC ++ 11 g ++,所以如果这些是你唯一关注的目标,那么 您可以确定始终拥有最新版本 使用它。)

另外,如果要访问矢量的最后一个元素 循环,myvector.back()将返回对它的引用。 (如果向量为空,则myvector.back()是未定义的行为, 但如果向量为空,则不会进入循环。)