【发布时间】:2012-04-26 20:54:33
【问题描述】:
如何在添加后 30 秒内从链表中删除项目?你有什么想法吗?这个问题是我面试时被问到的。
【问题讨论】:
-
我很有信心不用超频和水冷就能在我的机箱上实现这一点。也许您应该添加更多条件?列表是否应该在它们“存活”30 秒后自动删除项目,例如。通过内螺纹?
标签: c++ list data-structures linked-list
如何在添加后 30 秒内从链表中删除项目?你有什么想法吗?这个问题是我面试时被问到的。
【问题讨论】:
标签: c++ list data-structures linked-list
std::list<int> l;
l.push_back(42);
l.pop_back();
除非您的计算机速度难以置信,否则应该在 30 秒的时间限制内完成。
【讨论】:
当您说“内部”时,您是指任何时间吗?或经过 30 秒。如果您试图使项目过期,那么您需要在某处放置一个计时器。
您可以创建一种在固定时间(到期)移动项目的队列。
您可以像垃圾收集器一样不断地排队,在这种情况下,删除将是不确定的。
或者您可以在项目本身上放置一个计时器,当您将项目添加到队列时启动,它会在时间到期时向列表发出信号。然后列表可以删除该项目。
【讨论】:
我不确定“添加后 30 秒内”是什么意思,但我看到了两种可能性:
您希望尽可能快地做到这一点
std::list<type> my_list;
my_list.push_back(element);
my_list.pop_back();
您希望尽可能接近 30 秒,在这种情况下,您可以简单地添加元素,然后在 30 秒后将其删除:
#include <unistd.h>
// push back element here
sleep(30);
// pop back element here
【讨论】:
首先,您需要能够为此测量时间。您可以使用 std::time(NULL) 并执行繁忙循环,直到所需时间过去,但这似乎不合适:首先,您在等待时使 CPU 工作,其次,您不能做很多有意义的任务,而你在等)。
下一个最好的方法是使用线程:您创建一个线程,该线程将等到经过的时间,然后从列表中删除元素,而另一个线程执行一些有意义的工作。 C++03 标准没有定义使用线程的通用方式(因此您需要查找正在使用的线程库的详细信息)。 C++11 标准确实定义了自己的内存模型并提供线程库作为 atnadard 库 (STL) 的一部分。
【讨论】: