2

我有一个向量数组arr,我想从数组向量中搜索并删除在其中一个元素中具有特定值的向量,称之为elementA。它发生在我身上,如果你看一下数组内部,这样的条件对于连续的几个连续向量是完全满足的。

4

4 回答 4

2

在您的代码中:

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.

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

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

于 2013-02-07T10:08:23.960 回答
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 ); 
于 2013-02-07T10:06:20.850 回答
1

你可以使用remove-erase idioms来简化你的代码:

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; }));
于 2013-02-07T10:54:18.263 回答
0

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

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

我们将使用@billzIsZeroA引入的谓词。

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()) );
于 2013-02-08T21:24:50.900 回答