繁体   English   中英

在向量C ++上运行时发生运行时断言错误

[英]runtime assertion error while operating on vector c++

我有一个向量数组arr ,我想从数组中搜索并删除其中一个元素具有特定值的向量,将其称为elementA 我碰巧,如果您查看一下数组内部,就可以满足连续几个连续向量的条件。

在您的代码中:

int eStart = -1; int eEnd = -1; 
for ( int i=0; i<arr.size()-1; i++ )
{
    if ( -1 == eStart && arr[i].getElementA() == 0 )
        eStart = i;
    if ( arr[i].getElementA() == 0 )
        eEnd = i;
}
arr.erase( arr.begin()+eStart, arr.begin()+eEnd ); 

传递给擦除的第二个迭代器必须是您要擦除的最后一个迭代器之后的迭代器(仅当您找到需要擦除的某些元素时才调用擦除):

arr.erase( arr.begin()+eStart, arr.begin()+eEnd +1 ); 

错误:在算术期间检查“迭代器的范围”:结果必须是>=第一个元素,而<=最后一个元素。 begin()-1不适合:当您不检查是否找到时(即eRtart=-1时) eRtart=-1这种情况。

_SCL_SECURE_VALIDATE_RANGE(
        _Myptr + _Off <= ((_Myvec *)(this->_Getmycont()))->_Mylast &&
        _Myptr + _Off >= ((_Myvec *)(this->_Getmycont()))->_Myfirst);
    _Myptr += _Off;

注意:建议不要从std :: containers继承。

int eStart = -1; int eEnd = -1; 
for ( int i=0; i<arr.size()-1; i++ )
{
    if ( -1 == eStart && arr[i].getElementA() == 0 )
        eStart = i;
    if ( arr[i].getElementA() == 0 )
        eEnd = i;
}
if(estart != -1)    // added check <---------------------------------
    arr.erase( arr.begin()+eStart, arr.begin()+eEnd ); 

您可以使用remove-erase习惯用法来简化代码:

struct IsZeroA
{
  IsZeroA() {}
  bool operator()(ClassA a) 
  {
    return a.getElementA() == 0;
  }
};

arr.erase(std::remove_if(arr.begin(), arr.end(), IsZeroA()), arr.end());

或者,如果您使用C ++ 11,请使用lambda

arr.erase(std::remove(arr.begin(), arr.end(), 
         [](const ClassA& a){ return a.getElementA() == 0; }));

现在,我们不需要查看您的代码,而是提供一个“通用”解决方案。

我了解您明确希望利用要擦除的元素是连续的这一事实。

我们将使用IsZeroA引入的谓词IsZeroA

auto first=find_if(arr.begin(), arr.end(), IsZero()  );
if(first!=arr.end())
{
    auto last= find_if_not(first, arr.end(), IsZero()  );
    arr.erase(first,last);
}

可以简化为:

auto  first = find_if  (arr.begin(), arr.end(), IsZero()  );
arr.erase( first, find_if_not(first, arr.end(), IsZero()) );

暂无
暂无

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

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