ベクトルの配列arrがあり、要素の 1 つに特定の値を持つ配列ベクトルを検索して削除したいので、それをelementAと呼びます。たまたま、配列の内部を見ると、そのような条件は、連続するいくつかのベクトルに対して満たされています。
質問する
328 次
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 );
消去に渡される2番目のイテレータは、最後に消去したいものの1つ過ぎである必要があります(消去する必要のある要素が見つかった場合にのみ、eraseを呼び出します)。
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
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を使用する場合は、ラムダを使用します
arr.erase(std::remove(arr.begin(), arr.end(),
[](const ClassA& a){ return a.getElementA() == 0; }));
于 2013-02-07T10:54:18.263 に答える
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 に答える
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 に答える