我正在处理向量,在某个点上会有空值条目;我想删除给定向量中出现的所有空值。到目前为止,我的方法不起作用:
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类型,但没有成功。
任何帮助都将不胜感激。
发布于 2012-07-13 05:17:58
使用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。
发布于 2012-07-13 05:44:26
pmr绝对正确,您应该先使用remove,然后使用erase,这是代码中最重要的错误。但是,实际导致您报告的错误消息的错误如下:
变量sent_pkt_list和sent_flit_list是指向向量的指针,而不是指向向量的指针。因此,当您说像sent_pkt_list[i]这样的东西时,这是在执行C风格的数组索引,而不是向量索引。sent_pkt_list[i]的值是一个vector<Packet*> (毫无疑问是无意义的,因为它有效地取消了对伪指针的引用),而不是Packet*。因此,您可以尝试将其与NULL进行比较,后者当然不起作用。
https://stackoverflow.com/questions/11460810
复制相似问题