стирание записи из вектора повышения - PullRequest
0 голосов
/ 28 июня 2018

Во-первых, я относительно новичок в повышении. У меня есть вектор типа: boost::container::vector<std::string> plates и я повторяю это с
for ( unsigned int k = 0; k < plates.size(); k++ ), пока все хорошо.

Теперь мне нужно удалить элементы из цикла, и я попытался сделать следующее: plates.erase(plates.begin()+k); но это дает мне вывод ниже и завершает мое приложение:

include/boost/container/vector.hpp:1595: boost::container::vector<T, Allocator, Options>::reference boost::container::vector<T,
, Options>::size_type) [with T = std::__cxx11::basic_string<char>; Allocator = boost::container::new_allocator<std::__cxx11::basic_string<char> >; Options = void; boost
:basic_string<char>&; boost::container::vector<T, Allocator, Options>::size_type = long unsigned int]: Assertion `this->m_holder.m_size > n' failed.

Что я здесь не так делаю? Мой цикл выглядит примерно так, где foo() возвращает указатель или NULL:

for ( unsigned int k = 0; k < plates.size(); k++ ) {
        if (foo(&lpmap, plates[k]) != NULL){
                std::cout << "DEBUG: erase" << std::endl;
                plates.erase(plates.begin()+k);
        } else {
            std::cout << "print " << plates[k] << std::endl;
        }
    }

РЕДАКТИРОВАТЬ 1

for ( unsigned int k = 0; k < plates.size();) {
        if (foo(&lpmap, plates[k]) != NULL){
                std::cout << "DEBUG: erase" << std::endl;
                plates.erase(plates.begin()+k);
        } else {
            std::cout << "print " << plates[k] << std::endl;
            k++;
        }
    }

1 Ответ

0 голосов
/ 28 июня 2018

В бусте есть утверждение, которое проверяет, пытаетесь ли вы получить доступ к индексу вне диапазона. так что если вы использовали plates[k] с k больше, чем фактический размер, вы получите утверждение.

Вы можете увидеть чек прямо в коде повышения: https://www.boost.org/doc/libs/master/boost/container/vector.hpp.

...