I'm working with vectors and at some point there will be NULL entries; I want to erase all NULL occurrences within the given vectors. My approach so far is not working:
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]);
Where
vector<Flit*> *sent_flit_list;
vector<Packet*> *sent_pkt_list;
are the vectors. I have tried casting to a type (Flit*)NULL/(Flit*)0 but with no success.
Any help will be greatly appreciated.
Use the Erase-Remove idiom to remove elements based on a predicate from a container.
In your case:
// 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));
Your current approach isn't working, because vector::erase expects an iterator to an element of the vector and not a value of the stored type.
Frankly, what you are doing seems a little bit strange. You shouldn't store pointers, but values in containers. If you require nullable
values, use a Maybe
class such as boost::optional
.
pmr
is absolutely correct that you should be using remove
followed by erase
, and that this is the most important mistake in the code. However, the mistake that's actually causing the error message you report is as follows:
Your variables sent_pkt_list
and sent_flit_list
are pointers to vectors, not vectors. Therefore, when you say something like sent_pkt_list[i]
, this is doing C-style array indexing, not vector indexing. The value of sent_pkt_list[i]
is a (doubtless nonsensical because it's effectively dereferencing a bogus pointer) vector<Packet*>
, not a Packet*
. So you then try to compare that against NULL
, which of course doesn't work.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With