stl — ошибка подтверждения времени выполнения при работе с вектором переполнения стека

у меня есть массив прибытие векторов, и я хочу найти и удалить из массива векторов, которые имеют определенное значение в одном из элементов, назовите его Elementa. Со мной случается так, что, если вы посмотрите внутрь массива, такое условие будет выполнено для пары последовательных векторов подряд.

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.

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;
}
if(estart != -1)    // added check <---------------------------------
arr.erase( arr.begin()+eStart, arr.begin()+eEnd );
1

Вы могли бы использовать удалить-стереть идиомы чтобы упростить ваш код:

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

Теперь нам не нужно пересматривать ваш код, но мы предлагаем «общее» решение.

Я понимаю, что вы явно хотите воспользоваться тем, что элементы для удаления являются последовательными.

Мы будем использовать предикат IsZeroA представлен @billz.

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()) );
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector