我试图在下面的'while'循环中删除双端队列中的多个元素,但是我的程序没有给出正确的结果。
packet_deque
包含9个Packet
对象-其中一些已发送而其他未发送。
#include <deque>
#include <iostream>
class Packet
{
public:
void set_sent() { sent = true; };
bool get_sent() { return sent; };
private:
/* members of Test class */
bool sent = false;
};
int main()
{
size_t MAX = 9;
std::deque<Packet> packet_deque(MAX);
unsigned int i = 0;
std::deque<Packet>::iterator itr = packet_deque.begin();
printf("Before erasing sent packets - packet_dequeue size: %d \n", packet_deque.size());
// initialise the packet queue - creating some sent packets
for (; itr != packet_deque.end(); ++itr)
{
// set some sent packets
if (i % 3 == 0)
{
itr->set_sent();
}
printf("packet_deque[%d]: %s\n", i, itr->get_sent() ? "sent" : "not_sent");
++i;
}
printf("\n");
// erase sent packets in packet_dequeue
itr = packet_deque.begin();
while (itr != packet_deque.end())
{
if (itr->get_sent())
{
// erase the element and do NOT move the pointer
packet_deque.erase(itr);
}
else
{
// move to next element
++itr;
}
}
printf("After erasing sent packets - packet_dequeue size: %d \n", packet_deque.size());
for (itr = packet_deque.begin(), i = 0; itr != packet_deque.end(); ++itr)
{
printf("packet_deque[%d]: %s\n", i, itr->get_sent() ? "sent" : "not_sent");
++i;
}
}
终端输出是:
Before erasing sent packets - packet_dequeue size: 9
packet_deque[0]: sent
packet_deque[1]: not_sent
packet_deque[2]: not_sent
packet_deque[3]: sent
packet_deque[4]: not_sent
packet_deque[5]: not_sent
packet_deque[6]: sent
packet_deque[7]: not_sent
packet_deque[8]: not_sent
After erasing sent packets - packet_dequeue size: 5
packet_deque[0]: not_sent
packet_deque[1]: not_sent
packet_deque[2]: not_sent
packet_deque[3]: not_sent
packet_deque[4]: not_sent
由于while
循环仅删除了sent
数据包,我希望有6个未发送的数据包,但只有5个。我不知道出了什么问题...为什么最终结果仅包含5个未发送的数据包,而不是6个未发送的数据包?
erase
返回一个新的有效迭代器,该迭代器在删除元素后立即指向该元素,因此正确的代码是itr = packet_deque.erase(itr);
itr = packet_deque.erase(itr);
否则当前的迭代器无效。
除非所有迭代器和引用都无效,除非被删除的元素位于容器的末尾或开头,在这种情况下,仅迭代器和对被擦除元素的引用都将无效。
所以你的循环
while (itr != packet_deque.end()) { if (itr->get_sent()) { // erase the element and do NOT move the pointer packet_deque.erase(itr); } else { // move to next element ++itr; } }
实际上是错误的。
编辑:您应该使用itr = packet_deque.erase(itr);
获得有效的迭代器。