C++ 在向量c+;上操作时发生运行时断言错误+;

C++ 在向量c+;上操作时发生运行时断言错误+;,c++,stl,runtime,erase,assertion,C++,Stl,Runtime,Erase,Assertion,我有一个向量数组arr,我想从数组中搜索并删除在其中一个元素中具有特定值的向量,称之为elementA。我碰巧发现,如果你看一下数组内部,这样的条件对于一行中的两个连续向量是满的 int eStart=-1;int eEnd=-1; int eStart = -1; int eEnd = -1; for ( int i=0; i<arr.size()-1; i++ ) { if ( -1 == eStart && arr[i].getElementA() == 0

我有一个向量数组arr,我想从数组中搜索并删除在其中一个元素中具有特定值的向量,称之为elementA。我碰巧发现,如果你看一下数组内部,这样的条件对于一行中的两个连续向量是满的

int eStart=-1;int eEnd=-1;
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 ); 
对于(inti=0;i
intestart=-1;inteend=-1;
对于代码中的(int i=0;i:

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 ); 
struct IsZeroA
{
  IsZeroA() {}
  bool operator()(ClassA a) 
  {
    return a.getElementA() == 0;
  }
};

arr.erase(std::remove_if(arr.begin(), arr.end(), IsZeroA()), arr.end());
错误:在算术过程中检查“迭代器范围”:结果必须是
=
第一个元素,并且代码中的

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 ); 
struct IsZeroA
{
  IsZeroA() {}
  bool operator()(ClassA a) 
  {
    return a.getElementA() == 0;
  }
};

arr.erase(std::remove_if(arr.begin(), arr.end(), IsZeroA()), arr.end());
错误:在算术过程中检查“迭代器范围”:结果必须是
=
第一个元素,并且
可以用来简化代码:

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 ); 
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; }));
您可以使用来简化代码:

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 ); 
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; }));

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

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

我们将使用@billz引入的谓词
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()) );

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

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

我们将使用@billz引入的谓词
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()) );

代码中的哪一行未通过断言?您能显示
arr
的声明吗?代码中的哪一行未通过断言?您能显示
arr
的声明吗?为什么超过最后一行?begin()指向第一个元素,它指示0,所以如果我将eEnd添加到begin()我得到了我认为完全正确的指示。@eReM所有采用迭代器范围的
std
函数都采用参数“迭代器到范围中的第一个元素”和“迭代器到范围中的最后一个元素”。或者,从数学上讲,
[first,last]
。当然,我混合了索引和元素,认为如果我想指向第I个元素,我就必须使用第I-1个索引。为什么要超过最后一个?begin()指向第一个元素,它的标记为0,所以如果我将eEnd添加到begin()中,我想我会得到完全正确的标记。@eReM All
std
使用迭代器范围的函数取参数“迭代器指向范围内的第一个元素”和“迭代器指向范围内的最后一个元素”。或者,从数学上讲,
[第一,最后)
。当然,我混合了索引和元素,认为如果我要指向第I个元素,我必须使用I-1th索引。@josh130:执行这两行(加上pdefined谓词)解决了问题?很抱歉没有收到你问题的通知。你的第一个答案解决了问题,谢谢!@josh130:这两行(加上pdefined谓词)解决了问题吗?很抱歉没有收到你问题的通知。你的第一个答案解决了问题,谢谢!