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秒以内」とはどういう意味かわかりませんが、2つの可能性があります。

  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 に答える