添加后如何在 30 秒内从链表中删除项目?你有什么想法吗?这个问题是我面试时被问到的。
5 回答
std::list<int> l;
l.push_back(42);
l.pop_back();
除非您的计算机速度非常慢,否则应该在 30 秒的时间限制内完成。
当您说“在”时,您是指任何时间吗?或经过 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) 的一部分。