【问题标题】:How to remove an item from a linked list within 30 seconds after the addition of? [closed]添加后如何在 30 秒内从链表中删除项目? [关闭]
【发布时间】:2012-04-26 20:54:33
【问题描述】:

如何在添加后 30 秒内从链表中删除项目?你有什么想法吗?这个问题是我面试时被问到的。

【问题讨论】:

  • 我很有信心不用超频和水冷就能在我的机箱上实现这一点。也许您应该添加更多条件?列表是否应该在它们“存活”30 秒后自动删除项目,例如。通过内螺纹?

标签: c++ list data-structures linked-list


【解决方案1】:
std::list<int> l;
l.push_back(42);
l.pop_back();

除非您的计算机速度难以置信,否则应该在 30 秒的时间限制内完成。

【讨论】:

    【解决方案2】:

    当您说“内部”时,您是指任何时间吗?或经过 30 秒。如果您试图使项目过期,那么您需要在某处放置一个计时器。

    您可以创建一种在固定时间(到期)移动项目的队列。

    您可以像垃圾收集器一样不断地排队,在这种情况下,删除将是不确定的。

    或者您可以在项目本身上放置一个计时器,当您将项目添加到队列时启动,它会在时间到期时向列表发出信号。然后列表可以删除该项目。

    【讨论】:

      【解决方案3】:

      我不确定“添加后 30 秒内”是什么意思,但我看到了两种可能性:

      1. 您希望尽可能快地做到这一点

        std::list<type> my_list;
        my_list.push_back(element);
        my_list.pop_back();
        
      2. 您希望尽可能接近 30 秒,在这种情况下,您可以简单地添加元素,然后在 30 秒后将其删除:

        #include <unistd.h>
        
         // push back element here
        sleep(30);
         // pop back element here
        

      【讨论】:

      • 你指的是什么睡眠功能?我不知道 C++ 中有一个标准的
      • @Attila 这是一个 posix 函数,所以它应该在所有类似 unix 的发行版中......这是手册页 - linux.die.net/man/3/sleep
      【解决方案4】:

      首先,您需要能够为此测量时间。您可以使用 std::time(NULL) 并执行繁忙循环,直到所需时间过去,但这似乎不合适:首先,您在等待时使 CPU 工作,其次,您不能做很多有意义的任务,而你在等)。

      下一个最好的方法是使用线程:您创建一个线程,该线程将等到经过的时间,然后从列表中删除元素,而另一个线程执行一些有意义的工作。 C++03 标准没有定义使用线程的通用方式(因此您需要查找正在使用的线程库的详细信息)。 C++11 标准确实定义了自己的内存模型并提供线程库作为 atnadard 库 (STL) 的一部分。

      【讨论】:

        【解决方案5】:

        我会使用signalalarm

        int popit();
        signal(SIGALRM, popit);
        std::list<int> l;
        l.push_back(42);
        alarm(30);
        

        流行:

        popit(){
           l.pop_back();
        }
        

        【讨论】:

        • 这是特定于平台 (*nix) 的
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-29
        • 2014-12-24
        • 2014-03-01
        • 1970-01-01
        • 2015-11-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多