簡體   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