문제

오늘 나는 컨테이너에서 일치하는 기호를 찾기 위해 작은 술어를 썼습니다.

하지만 나는 문제에 직면했다 : 나는이 술어를 std::find_if 이 클래스의 구성원 인 컨테이너를 검색하여 클래스의 const 방법을 호출하십시오.

그러나 나는 방금 그다지 알았습니다 std::find ...도 아니다 std::find_if 작동 할 수 있습니다 const_iterators !

C ++ 참조를 확인했는데 버전이없는 것 같습니다. std::find 또는 std::find_if 수락/반환 const_iterators. 내가 본 이유 에서이 알고리즘이 반복자가 참조하는 객체를 수정할 수있는 방법이 없기 때문에 왜 그런지 이해할 수 없습니다.

여기에 문서화 된 방법이 있습니다 std::find SGI 구현에서 :

*i == 값을 제공하는 첫 번째 반복자 i를 [첫 번째, 마지막)에서 반환합니다. 그러한 반복기가 존재하지 않으면 마지막으로 반환됩니다.

도움이 되었습니까?

해결책

std::find 그리고 std::find_if 확실히 작동 할 수 있습니다 *::const_iterator 주어진 컨테이너의 경우. 우연히 그 기능의 서명을보고 오해하고 있습니까?

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

주목하십시오 InputIterator 다음은 템플릿 유형 매개 변수의 이름과 const_iterator 이에 대한 요구 사항을 충족시킬 것입니다.

아니면 아마도 당신은 혼란 스럽습니다 const_iterator (즉, const 값을 참조하는 반복자) const 반복자 (즉, 반복 자 그 자체 const)?

다른 팁

std::find 그리고 std::find_if 둘 다 반복자 유형을 템플릿 매개 변수로 가져 가므로 가장 확실합니다. ~할 수 있다 에 운영 const_iterators. 빠른 예를 위해서만 :

#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;
}

이것은 올바르게 작동하는 C ++ 컴파일러에 의해 허용되고 다음과 같은 결과를 생성해야합니다.

3 위치에서 발견 : 20

나는 방금 같은 문제를 겪었습니다. 나는 호출하는 회원 기능이있었습니다 find_if 멤버 벡터에서, 컴파일러는 멤버 기능을 만들려고했을 때 오류가 발생했습니다. const. 이것은 내가 find_if an iterator 대신에 const_iterator. 이로 인해 컴파일러가 find_if 또한해야합니다 iterator 대신에 const_iterator, 그것은 그것을 얻을 수 없었습니다 const 멤버 벡터.

우연히 나와 같은 이유로 여기에 있다면 :

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

그것은 관련이 없습니다 const_iterator에스. 당신은 아마 방금 잊었을 것입니다 #include <algorithm> :-)

방금이 코드에 문제가있었습니다.

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

오류는 "std :: 찾기의 과부하가 일치하지 않습니다"였습니다.

내가 필요한 수정은 Cend ()를 사용하는 것이 었습니다. cbegin ()가 필요하지 않다는 것은 혼란스럽고, 왜 변환이 왜 (암시 적으로), end ()가 함수 매개 변수로서 왜 괜찮은지 잘 모르겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top