2010-06-01 17 views
7

std :: queue를 반복하는 데 BOOST_FOREACH를 사용하려고합니다.std 대기열을 통해 반복하기

std::queue<std::string> someList; 
BOOST_FOREACH(std::string temp, someList) 
{ 
    std::cout << temp; 
} 

>no matching function for call to begin(...) 
>no type named ‘iterator’ in ‘class std::queue<std::basic_string<char> >’ 

내가 좋아하는 구조가 필요합니다 :하지만 오류가있는 클래스 원인의 반복자가없는 첫 번째 온다, 첫 번째는 사라집니다.

+1

가능한 중복 : http://stackoverflow.com/questions/1259099/ –

답변

19

std::deque은 데이터 구조의 시작과 끝에서 효율적인 삽입 및 제거를 지원합니다. push_backpop_front을 사용하여 수동으로 대기열 작업을 수행 할 수 있습니다.

큐는 기본적으로 내부적으로 deque를 사용합니다. 그것은 대기열 작업 만 노출하는 래퍼입니다 (따라서 왜 반복 작업을 할 수 없습니까?). 나는 similar question을 물었고, 가장 좋은 대답은 std::queue의 실제 사용에 대한 좋은 통찰력을주었습니다. std::queue을 사용해야한다. 왜냐하면 큐가 필요하기 때문이 아니라 주어진 데이터 구조에서 큐와 같은 연산 만 유효하다는 것을 분명히하기 위해서이다. 그것보다 더 자유가 필요해 보이므로, deque, list 또는 다른 구조를 O (1)로 삽입하고 양쪽에서 제거하십시오.

+0

큐가 큐보다 간단하다고 생각했습니다 (perf + mem). 하지만 당신의 대답 (그리고 헤더 파일을 통해 확인) 후, 큐의 경우 일부 작업에 대한 제한을 제외하고 대기열이나 deque에 관계없이 perf와 메모리에 차이가 없다고 생각합니다. – Makesh

4

경우는 push_front와 표준 : : 목록을 사용하고

1

std::queue 컨테이너 어댑터입니다와 pop_back 수 있습니다. 기본 기본 컨테이너로 std::deque을 사용합니다. 이 컨테이너에 액세스 할 수 없으므로 어떤 방식 으로든 반복되지 않습니다.

가장 좋은 방법은 std::deque 또는 std::list을 사용하고 대기열 동작을 직접 관리하는 것입니다. 주위에 래퍼를 제공 할 수도 있습니다.