c++ - 删除双端队列 C++ 中的多个元素

标签 c++ iterator containers deque

我试图在下面的“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个未发送的数据包?

最佳答案

一般来说,所有迭代器在从双端队列中删除后都会失效。您的代码在 while 条件中使用了无效的迭代器。

但是 erase 返回一个新的有效迭代器,指向紧跟在被删除元素之后的元素,所以正确的代码是

itr = packet_deque.erase(itr);

关于c++ - 删除双端队列 C++ 中的多个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61371712/

相关文章:

c++ - 如何强制使用模板特化?

c++ - 检查 "is int"/"is double"/etc 的模板函数

c++ - 在编译时确定 Eigen3 矩阵的存储顺序

c++ - 为什么即将推出的范围库不支持范围内的容器初始化?

mysql - laravel 在 mysql docker 容器启动时迁移数据库

python - 在单个 docker 容器或连接到同一个数据库的两个容器中运行两个进程?

C++/Win32 构造函数未使用从对话框获取的字符串初始化变量

java - ConcurrentSkipListSet 如何具有弱一致的迭代器?了解 'weakly consistent'的含义

java - 公开内部集合项时应该使用 Iterator 还是 Iterable?

performance - 使用toList不好吗?