在std向量中查找NULL指针

时间:2012-07-12 21:16:01

标签: c++ pointers stl null

我正在使用向量,并且在某些时候会有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但没有成功。

非常感谢任何帮助。

2 个答案:

答案 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_listsent_flit_list指向向量的指针,而不是向量。因此,当你说sent_pkt_list[i]之类的东西时,这就是做C风格的数组索引,而不是向量索引。 sent_pkt_list[i]的值是一个(无疑是荒谬的,因为它实际上是解除引用虚假指针)vector<Packet*>,而不是Packet*。因此,您尝试将其与NULL进行比较,这当然不起作用。