2009-10-27 5 views
4

오늘 컨테이너에 일치하는 기호를 찾기 위해 작은 조건자를 작성했습니다.STL 알고리즘 및 const_iterators

하지만 문제가 있습니다 :이 클래스의 구성원 인 컨테이너에서 검색하여 클래스의 const 메서드 내부에서 std::find_if 호출에서이 조건자를 사용하고 싶습니다.

그러나 나는 std::findstd::find_ifconst_iterators에서 작동 할 수 없다는 것을 알아 챘습니다.

일부 C++ 참조를 확인했는데 std::find 또는 std::find_if의 버전이 허용/반품하는 것 같습니다 (const_iterators). 나는 왜 내가 본 것 때문에이 알고리즘이 반복자가 참조하는 객체를 수정할 수있는 방법이 없기 때문에 왜 그런지 이해할 수 없다. 여기

는 SGI 구현에서 std::find를 기록하는 방법이다

는 범위 제 반복자 I를 반환 [제 마지막) 등 * i의 값 == . 그러한 반복자가없는 경우에 마지막으로 리턴합니다.

+0

실제 오류는 무엇입니까? 샘플 코드를 게시 할 수 있습니까? 감사합니다 –

+2

사실, 당신은 단지 설명서를 잘못 읽었습니다, 아래 Pavel의 대답을보십시오. 테스트하면 확실히 작동하는 것을 볼 수 있습니다. –

+0

당신의 질문은 당신이 작동하지 않는 코드를 가지고 있음을 의미합니다 - 특별히 "그러나 나는 문제에 직면했습니다"- 실제로 당신은 단순히 큰 소리로 생각하고 있습니다. 나는 당신이 그것을 시도했다면이 질문을 축소했다. –

답변

13

std::findstd::find_if 확실히 주어진 컨테이너 *::const_iterator에서 작동 할 수 있습니다. 당신은 우연히 그 기능들의 서명을보고 오해하고 있습니까? InputIterator 여기에 단지 템플릿 형식 매개 변수의 이름이고, 어떤 const_iterator 그것을 위해 요구 사항을 만족시킬 것을

template <class InputIterator, class Type> 
InputIterator find(InputIterator first, InputIterator last, const Type& val); 

참고.

또는, 아마, 당신이 (자체 const 즉 반복자)는 const 반복자와 const_iterator (즉, 반복자 CONST 값을 참조)을 혼란거야?

+0

Ohw, 너무 늦은 것 같아요. 수만 장을 넘기고 제가 원한 것을 읽을 때마다, 쓰여진 것이 x가 아니 었습니다. ( 인내심에 감사드립니다. – NewbiZ

5

std::findstd::find_if 모두 템플릿 매개 변수로 반복자 타입을, 그래서 그들은 확실히 const_iterators에서 작동 할 수 있습니다. 이것은 어떤 제대로 작동 C++ 컴파일러에 의해 받아 들여 같은 결과를 생성해야한다

#include <vector> 
#include <algorithm> 
#include <iostream> 
int main() { 
    std::vector<int> x; 

    std::fill_n(std::back_inserter(x), 20, 2); 
    x.push_back(3); 

    std::vector<int>::const_iterator b = x.begin(); 
    std::vector<int>::const_iterator e = x.end(); 

    std::vector<int>::const_iterator p = std::find(b, e, 3); 

    std::cout << *p << " found at position: " << std::distance(b, p) << "\n"; 
    return 0; 
} 

: 그냥 빨리 예를 들어

3 위치에서 찾을 : 20

1

난 그냥 같은 문제가 있었다 . 구성원 벡터에서 find_if을 호출하는 멤버 함수가 있었으며 컴파일러에서 멤버 함수를 만들려고하면 오류가 발생했습니다 const. 그 이유는 find_if의 반환 값을 const_iterator 대신 iterator에 할당했기 때문입니다. 이로 인해 컴파일러에서 find_if의 매개 변수도 const 멤버 벡터에서 가져올 수없는 const_iterator 대신 iterator이어야한다고 가정했습니다.만일 당신이 저와 같은 이유로 여기 경우

0

:

error: no matching function for call to ‘find(std::vector<int>::const_iterator, std::vector<int>::const_iterator, int)’ 

const_iterator의와는 아무 상관이 없습니다.

std::string str; 
std::string::const_iterator start = str.begin(); 
std::string::const_iterator match = std::find(start, str.end(), 'x'); 

오류는 "표준에 대한 일치 과부하 :: 찾기"가 없었다 : 당신은 아마 난 그냥이 코드에 문제가 있었다

0

:-) #include <algorithm>를 잊어 버렸습니다.

필요한 수정 프로그램은 cend()를 사용하는 것이 었습니다. cbegin()이 필요하지 않다는 것이 혼란 스럽습니다. 왜 변환이 (암시 적으로) 괜찮은지, end()가 함수 매개 변수가 아닌지 확실하지 않습니다.

관련 문제