0
          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)。我只是看不出有什么问题。

4

3 回答 3

2

您的循环是错误的,请阅读文档

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

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

于 2013-02-21T22:59:16.733 回答
1

正如其他人所说,C++ 迭代器定义了一个半开区间 ( '[begin()...end())'),这也是您在大多数其他情况下可能也应该使用的。尽管它适用于来自向量的迭代器,但一般来说,迭代器不支持 <=(nor <); 循环的标准习语是:

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

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

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

于 2013-02-21T23:17:38.303 回答
0

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

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

您还有其他损坏的逻辑,即最后需要修复的取消引用。

于 2013-02-21T22:45:55.760 回答