Seb*_*ebi 4 c++ null pointers stl
我正在使用向量,在某些时候会有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]);
Run Code Online (Sandbox Code Playgroud)
哪里
vector<Flit*> *sent_flit_list;
vector<Packet*> *sent_pkt_list;
Run Code Online (Sandbox Code Playgroud)
是向量.我已经尝试转换为类型(Flit*)NULL /(Flit*)0但没有成功.
任何帮助将不胜感激.
pmr*_*pmr 14
使用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));
Run Code Online (Sandbox Code Playgroud)
您当前的方法不起作用,因为vector :: erase需要迭代器到向量的元素而不是存储类型的值.
坦率地说,你在做什么似乎有点奇怪.您不应该存储指针,而是存储容器中的值.如果需要nullable值,请使用Maybe诸如的类boost::optional.
pmr是绝对正确的,你应该使用remove之后erase,并认为这是在代码中最重要的错误.但是,实际导致您报告的错误消息的错误如下:
你的变量sent_pkt_list,并sent_flit_list有指向载体,没有载体.因此,当你说出类似的东西时sent_pkt_list[i],这就是做C风格的数组索引,而不是矢量索引.值sent_pkt_list[i]是一个(无疑是荒谬的,因为它有效地解除引用虚假指针)vector<Packet*>,而不是一个Packet*.所以你试着比较一下NULL,这当然不起作用.