C++ 在向量c+;上操作时发生运行时断言错误+;
我有一个向量数组arr,我想从数组中搜索并删除在其中一个元素中具有特定值的向量,称之为elementA。我碰巧发现,如果你看一下数组内部,这样的条件对于一行中的两个连续向量是满的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
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;iintestart=-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 Allstd
使用迭代器范围的函数取参数“迭代器指向范围内的第一个元素”和“迭代器指向范围内的最后一个元素”。或者,从数学上讲,[第一,最后)
。当然,我混合了索引和元素,认为如果我要指向第I个元素,我必须使用I-1th索引。@josh130:执行这两行(加上pdefined谓词)解决了问题?很抱歉没有收到你问题的通知。你的第一个答案解决了问题,谢谢!@josh130:这两行(加上pdefined谓词)解决了问题吗?很抱歉没有收到你问题的通知。你的第一个答案解决了问题,谢谢!