繁体   English   中英

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

[英]c++ stl vector iterator insert segmentation fault

          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到这个向量。 但在一些事件之后我总是得到一个段错误:if(mysignal.declination <(* last).declination)。 我只是看不出有什么问题。

你的循环错了,请阅读文档

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

你不能取消引用end() ,它提供了一种知道你已经超出容器的方法,所以你的循环条件应该是it != myvector.end()last也是错误的。

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

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

您还有其他破坏的逻辑,这是您需要修复的最后解除引用。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM