在std向量中查找NULL指针

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.

  • 指针向量有什么问题?甚至智能指针? (3认同)
  • @Johan:其实没什么.有时,这是正确的做法.然而,OP使用了太多的它们被认为是正常的(指向指针矢量的指针,两次).当然,我们不知道确切的情况,但事实上OP正在使用那么多的pointerage,再加上他初学者甚至不知道`std :: remove`这一事实表明他已经过了一点点对他们来说很热心,可能根本不需要他们. (3认同)

Gar*_*han 5

pmr是绝对正确的,你应该使用remove之后erase,并认为这是在代码中最重要的错误.但是,实际导致您报告的错误消息的错误如下:

你的变量sent_pkt_list,并sent_flit_list指向载体,没有载体.因此,当你说出类似的东西时sent_pkt_list[i],这就是做C风格的数组索引,而不是矢量索引.值sent_pkt_list[i]是一个(无疑是荒谬的,因为它有效地解除引用虚假指针)vector<Packet*>,而不是一个Packet*.所以你试着比较一下NULL,这当然不起作用.