2012-04-26 5 views
0

추가 후 30 초 이내에 연결된 목록에서 항목을 제거하는 방법은 무엇입니까? 너 어떤 생각이라도 해봐? 이 질문은 인터뷰에서 질문을 받았습니다.추가 후 30 초 이내에 연결된 목록에서 항목을 제거하는 방법?

+0

... 뭐? –

+0

나는 overclocking 및 water-cooling없이 나의 상자에 이것을 달성 할다는 것을 상당히 확신한다. 어쩌면 더 많은 조건을 추가해야할까요? 목록은 30 초 동안 '살았'면 자발적으로 항목을 제거해야합니다. 내부 스레드에 의해? –

답변

1

'내'라고 말하면 언제든지 사용할 수 있습니까? 또는 30 초가 경과하면 항목을 만료하려는 경우 타이머를 어딘가에 두어야합니다.

고정 된 시간 (만료)에 항목을 이동시키는 대기열을 만들 수 있습니다.

가비지 수집기처럼 계속 대기열을 이동할 수 있습니다.이 경우 제거가 불확실합니다.

또는 항목을 대기열에 추가 할 때 시작되는 항목 자체에 타이머를 넣을 수 있습니다. 타이머는 시간이 만료되면 목록에 신호를 보냅니다. 그런 다음 목록에서 항목을 제거 할 수 있습니다.

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

당신이 매우 느린 컴퓨터가 없다면,이 30 초 제한 시간 내에에서 마무리해야한다.

0

우선, 시간을 측정 할 수 있어야합니다. std :: time (NULL)을 사용하고 필요한 시간이 지날 때까지 바쁜 루프를 수행 할 수 있지만 부적절한 것 같습니다. 주먹으로 CPU를 작동시키고 있습니다. 둘째, 많은 의미있는 작업을 수행 할 수 없습니다. 당신은 기다리고 있습니다).

다음으로 가장 좋은 것은 스레드를 사용하는 것입니다. 다른 스레드가 의미있는 작업을 수행하는 동안 ellapse 시간까지 대기하고 목록에서 요소를 제거하는 스레드를 만듭니다. C++ 03 표준은 쓰레드로 작업하는 일반적인 방법을 정의하지 않습니다 (사용중인 스레딩 라이브러리의 perticular를 찾아야합니다). C++ 11 표준은 자체 메모리 모델을 정의하고 스레딩 라이브러리를 atnadard 라이브러리 (STL)의 일부로 제공합니다.

1

난 당신이 "추가 후 30 초 이내에"무슨 뜻인지 모르겠지만 나는 두 가지 가능성을 참조하십시오, 당신은 가능한 한 빨리 < 30 초를이 작업을 수행 할 수

  1. 을하는 경우

    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 
    
+0

어떤 수면 기능을 말하는 겁니까? 나는 C++에서 표준적인 것을 알지 못했다. – Attila

+0

@Attila 그것은 posix 함수 다. 그래서 모든 유닉스 계열의 배포판에 있어야한다. 맨 페이지 - http : //linux.die가있다.net/man/3/sleep – paulrehkugler

0

나는 signalalarm을 사용 :

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

popit :

popit(){ 
    l.pop_back(); 
} 
+0

이것은 플랫폼 (* nix)과 관련이 있습니다 – Attila

관련 문제