5

我正在使用向量,在某些时候会有 NULL 条目;我想删除给定向量中的所有 NULL 出现。到目前为止,我的方法不起作用:

for(int i = sent_flit_list->size() - 1; i >= 0; i--)
if(sent_flit_list[i] == NULL)
    sent_flit_list->erase(sent_flit_list[i]);

for(int i = sent_pkt_list->size() - 1; i >= 0; i--)
if(sent_pkt_list[i] == NULL)
    sent_pkt_list->erase(sent_pkt_list[i]);

在哪里

vector<Flit*> *sent_flit_list;
vector<Packet*> *sent_pkt_list;

是向量。我尝试转换为 (Flit*)NULL/(Flit*)0 类型,但没有成功。

任何帮助将不胜感激。

4

2 回答 2

18

使用Erase-Remove 习惯用法根据谓词从容器中删除元素。

在你的情况下:

// with a predicate
my_vec.erase(std::remove_if(begin(my_vec), end(my_vec), 
                           [](Flit* x) { return x == nullptr; }), 
             end(my_vec));

// with a value value
my_vec.erase(std::remove(begin(my_vec), end(my_vec), nullptr),
             end(my_vec));

您当前的方法不起作用,因为vector::erase期望迭代器指向向量的元素,而不是存储类型的值。

坦率地说,你在做什么似乎有点奇怪。您不应将指针存储在容器中,而应将值存储在容器中。如果您需要nullable值,请使用Maybe诸如boost::optional.

于 2012-07-12T21:17:58.090 回答
5

pmr绝对正确,您应该使用remove后跟erase,这是代码中最重要的错误。但是,实际上导致您报告的错误消息的错误如下:

您的变量sent_pkt_listsent_flit_list指向向量的指针,而不是向量。因此,当您说类似 时sent_pkt_list[i],这是在执行 C 样式的数组索引,而不是向量索引。的值sent_pkt_list[i]是 a (无疑是荒谬的,因为它有效地解除了对虚假指针的引用) vector<Packet*>,而不是 a Packet*。因此,您然后尝试将其与 进行比较NULL,这当然是行不通的。

于 2012-07-12T21:44:26.327 回答