2016-06-04 2 views
3

우분투 14.04, g ++ 4.9.3입니다.배열의 벡터에서 std :: find를 사용하는 방법은 무엇입니까?

std::vector<std::array<int, 3>> a; 
a.push_back({2, 3, 1}); 
a.push_back({1, 3, 4}); 
a.push_back({3, 1, 2}); 

auto it = std::find(a.begin(), a.end(), {2, 3, 1}); 

아래의 코드는 내가이 문제를 해결하기 위해 람다 함수와 표준 : : find_if를 사용하는보다 정교한 방법을 알아 낸 몇 가지 인터넷 검색 세션 후 오류

couldn't deduce template parameter ‘_Tp’ 
     std::find(a.begin(), a.end(), {2, 3, 1}); 
              ^

을 반환하지만 왜 아무튼 이 코드는 작동하지 않습니까?

답변

4

조금 더 자세히 설명하면됩니다.

auto it = std::find(a.begin(), a.end(), std::array<int, 3>{2, 3, 1}); 

확인 된 gcc 5.3.1. gcc의 이전 버전에서이 문제를 처리 할 것인지 확실하지 않습니다.

+0

와우 ... 푸시 백이이 장황함이 필요없이 작동하기 때문에 혼란 스럽습니다. 당신의 대답을 받아 들일 것입니다. – user3667089

+1

@ user3667089'push_back'은 매개 변수 유형이 호출 된 표현식의 유형에서 추론 될 수 있기 때문에 작동합니다. –

+1

push_back의 경우'std :: initializer_list' 매개 변수 유형이 알려져 있으므로 이니셜 라이저 목록을 적절한'std :: initializer_list'로 직접 추론 할 수 있습니다. 'std :: find'로는 그다지 간단하지 않습니다. 왜냐하면 세 번째 인자는 초기화 인자 목록이 아닌 일반 템플릿 인자이기 때문입니다; 그러므로 그것은 추론 될 수 없다. –

관련 문제