我正在使用向量,并且在某些时候会有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但没有成功。
非常感谢任何帮助。
答案 0 :(得分:14)
使用Erase-Remove idiom根据容器中的谓词删除元素。
在你的情况下:
// 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
。
答案 1 :(得分:5)
pmr
绝对正确,您应该使用remove
后跟erase
,这是代码中最重要的错误。但是,实际导致您报告的错误消息的错误如下:
您的变量sent_pkt_list
和sent_flit_list
是指向向量的指针,而不是向量。因此,当你说sent_pkt_list[i]
之类的东西时,这就是做C风格的数组索引,而不是向量索引。 sent_pkt_list[i]
的值是一个(无疑是荒谬的,因为它实际上是解除引用虚假指针)vector<Packet*>
,而不是Packet*
。因此,您尝试将其与NULL
进行比较,这当然不起作用。