从升压向量中删除条目

时间:2018-06-28 14:51:31

标签: c++ vector boost erase

首先,我是新手。 我有一个向量类型: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 :(得分:1)

boost中有一个断言,用于检查您是否尝试访问超出范围的索引。因此,如果您使用plates[k]且k大于实际大小,则会得到一个断言。

您可以在提升代码https://www.boost.org/doc/libs/master/boost/container/vector.hpp中看到对勾。