1

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

4

5 回答 5

6
std::list<int> l;
l.push_back(42);
l.pop_back();

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

于 2012-04-26T21:00:46.830 回答
2

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

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

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

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

于 2012-04-26T21:05:36.830 回答
1

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

  1. 您希望尽可能快地做到这一点 < 30 秒,在这种情况下,您可以简单地添加元素然后删除它:

    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
    
于 2012-04-26T21:05:16.003 回答
0

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

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

于 2012-04-26T21:04:35.770 回答
0

我会使用信号警报

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

弹出它:

popit(){
   l.pop_back();
}
于 2012-04-26T21:20:59.310 回答