2010-06-08 2 views
6

대체 방법은 무엇입니까?C++에서 벡터를 찾을 수없는 이유

나 혼자서 작성해야합니까?

+1

아마도 "찾기"가 의도 한 것을 정의해야합니까? – KevenK

+20

'std :: find'가 있습니다. http://stackoverflow.com/questions/571394/how-to-find-an-item-in-a-stdvector/571405#571405 – meagar

+13

을 참조하십시오. STL의 아름다움은 컨테이너 및 알고리즘의 __ 디커플링에 있습니다 __. 그것들을 이터레이터와 함께. 이것은 내가 지금까지 보아 왔던 모든 OO 라이브러리보다 _ 더 큰 추상화로 이어지는 _ 의도 된 디자인 결정입니다. 좀 더 엄격한 OO 배경 (Java, C#)에서 나온다면, 처음 엔 이상하게 보일 수 있지만 _ 학습의 가치가있는 것은 분명합니다. – sbi

답변

41

, 당신의 벡터가 정렬되어있는 경우 예를 들어,

std::vector<int> v; 

// Finds the first element in the vector that has the value 42: 
// If there is no such value, it == v.end() 
std::vector<int>::const_iterator it = std::find(v.begin(), v.end(), 42); 

, 당신은 값이 벡터의 존재 여부를 테스트하는 std::binary_search()를 사용할 수 반복자 범위에서 선형 검색을 수행 std::find() 알고리즘이있다 반복자를 그 값을 가진 벡터의 요소 범위로 가져 오려면 std::equal_range()을 사용해야합니다.

+3

'std :: find'를 자유로운 함수로 가지는 이점은 메모리 배열,'std :: vector', 또는 선형 적으로 횡단 될 수있는 다른 컨테이너에서 작동한다는 것입니다. – Thanatos

+0

"멀티 스레드"할 수 있습니다. –

+0

당신은 일정한 요소 개선만을 볼 것입니다. 게다가'std :: find'가하는 것의 범위를 벗어납니다. (대부분의 상황에서는 멀티 스레드 검색이 필요하지 않습니다.) 그러나 매우 유사하게 작동하는'parallel_find() '를 작성할 수 있으며, 약간의 (꽤 느슨한) 요구 사항을 만족시키는 모든 컨테이너에서 작동합니다. – Thanatos

4

std::find(vec.begin(), vec.end(), value)을 사용하십시오.

그리고 당신에게 그 말<algorithm>

8

을 포함하는 것을 잊지 마세요? C++에서 vector에 대한 "find"알고리즘이 있습니다. 역설적으로 동시에, std::find이라고합니다. 또는 std::binary_search 일 수도 있습니다. 또는 벡터에 저장된 데이터의 속성에 따라 다른 것입니다.

컨테이너는 알고리즘의 효과적인 구현이 어떻게 든 컨테이너의 내부 세부 사항에 묶일 때만 고유 알고리즘의 특정 버전을 가져옵니다 (컨테이너 메소드로 구현 됨). std::list<>::sort이 하나의 예입니다.

다른 모든 경우에 알고리즘은 독립 실행 형 기능으로 구현됩니다.

+0

미안하지만, "find"라는 이름의 찾기 기능에 대해 아이러니 한 점은 무엇입니까? – jalf

+0

@ jalf : 나는 그것이 비꼬는 의도라고 생각한다 ... OP는 "find"가없고 "C++ find"에 대한 google 검색이 " std :: find' on cplusplus.com – KevenK

+3

그래서 냉소적으로 무언가를 아이러니하게 부르고 있습니다. ;) – jalf

21

vector::find이없는 이유는 std::find (std::findO(N)이며 일반적으로 벡터에 대해 더 잘할 수 없음)보다 알고리즘상의 이점이 없기 때문입니다.

그러나 좀 더 효율적으로 할 수 있기 때문에 당신이 map::find을 가지고있는 이유는 ( map::findO(log N)은 그래서 당신은 항상지도에 대한 std::find 이상 사용할 것입니다).

+0

벡터가 정렬되어 있으면 O (N)보다 확실히 잘 수행 할 수 있습니다. – moodboom

2

대체 방법은 무엇입니까?

표준은 유사 요소 등의 임의의 시퀀스를 순차 검색 할 때 std :: find를 제공합니다.

반복자를 지원하는 모든 컨테이너에 적용 할 수 있지만 내부 정렬 된 컨테이너의 경우 (예 : std::map) 검색을 최적화 할 수 있습니다. 이 경우 컨테이너는 자신의 find 멤버 함수를 제공합니다.

왜 C++에서 벡터를 찾을 수 없습니까?

구현이 std::find(vector.begin(), vector.end(), value_to_find);과 동일하므로 std::vector<???>::find을 생성 할 필요가 없습니다.

직접 작성해야합니까?

특정 제한 사항이나 요구 사항이 없으면 가능한 한 STL 구현을 사용해야합니다.

3

컨테이너 클래스에서 '찾기'기능이 'SRP'(Single Responsibility Principle)을 위반합니다. 컨테이너의 핵심 기능은 컨테이너의 요소 검색, 저장을위한 인터페이스를 제공하는 것입니다. 'Finding', 'Sorting', 'Iterating'등은 컨테이너의 핵심 기능이 아니므로 직접 인터페이스가 아닙니다.

'Herb'는 Namespace Principle으로되어 있지만 'find'는 'vector'즉 'std'와 동일한 네임 스페이스에 정의 됨으로써 인터페이스의 일부입니다.

+1

그러나 컨테이너가 자신의'find '함수를 제공하는 것이 전적으로 적합합니다. 일반적인'std :: find' 알고리즘 ('std :: map :: find'를 고려하십시오)보다 성능이 좋은 함수를 제공 할 수 있습니다. –

관련 문제