首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在标准向量中查找空指针

在标准向量中查找空指针
EN

Stack Overflow用户
提问于 2012-07-13 05:16:01
回答 2查看 4.2K关注 0票数 5

我正在处理向量,在某个点上会有空值条目;我想删除给定向量中出现的所有空值。到目前为止,我的方法不起作用:

代码语言:javascript
复制
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]);

哪里

代码语言:javascript
复制
vector<Flit*> *sent_flit_list;
vector<Packet*> *sent_pkt_list;

是向量。我尝试强制转换为(Flit*)NULL/(Flit*)0类型,但没有成功。

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-13 05:17:58

使用Erase-Remove idiom从容器中删除基于谓词的元素。

在您的案例中:

代码语言:javascript
复制
// 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

票数 18
EN

Stack Overflow用户

发布于 2012-07-13 05:44:26

pmr绝对正确,您应该先使用remove,然后使用erase,这是代码中最重要的错误。但是,实际导致您报告的错误消息的错误如下:

变量sent_pkt_listsent_flit_list是指向向量的指针,而不是指向向量的指针。因此,当您说像sent_pkt_list[i]这样的东西时,这是在执行C风格的数组索引,而不是向量索引。sent_pkt_list[i]的值是一个vector<Packet*> (毫无疑问是无意义的,因为它有效地取消了对伪指针的引用),而不是Packet*。因此,您可以尝试将其与NULL进行比较,后者当然不起作用。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11460810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档