Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在添加后30秒内从链表中删除项目?_C++_List_Data Structures_Linked List - Fatal编程技术网

C++ 如何在添加后30秒内从链表中删除项目?

C++ 如何在添加后30秒内从链表中删除项目?,c++,list,data-structures,linked-list,C++,List,Data Structures,Linked List,如何在添加后30秒内从链表中删除项目?你知道吗?这个问题是我在面试时被问到的 std::list<int> l; l.push_back(42); l.pop_back(); 除非你有一台速度非常慢的计算机,否则它应该在30秒内完成。首先,你需要能够测量这台计算机的时间。您可以使用std::timeNULL并在所需时间过去之前进行忙碌循环,但这似乎不合适:首先,您在等待时让CPU工作,其次,您在等待时无法完成很多有意义的任务 下一个最好的方法是使用线程:您创建一个线程,该线程将一直

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

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

除非你有一台速度非常慢的计算机,否则它应该在30秒内完成。

首先,你需要能够测量这台计算机的时间。您可以使用std::timeNULL并在所需时间过去之前进行忙碌循环,但这似乎不合适:首先,您在等待时让CPU工作,其次,您在等待时无法完成很多有意义的任务


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

我不确定添加后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

你说的“在”是指任何时间吗?或者在30秒后。如果你想让物品过期,那么你需要在某处放置一个计时器

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

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

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

我将使用和:


我相当有信心,我可以实现这一点,我的盒子没有超频和水冷。也许你应该再增加一些条件?列表是否应该在项目“生存”30秒后自动删除项目,例如通过内部线程?您指的是什么睡眠功能?我不知道在C++@Attila中有一个标准的函数,它是一个posix函数,所以它应该在所有类似unix的发行版中。。。这是手册页-这是特定于平台*nix的
int popit();
signal(SIGALRM, popit);
std::list<int> l;
l.push_back(42);
alarm(30);
popit(){
   l.pop_back();
}