STL 알고리즘 및 const_iterators
문제
오늘 나는 컨테이너에서 일치하는 기호를 찾기 위해 작은 술어를 썼습니다.
하지만 나는 문제에 직면했다 : 나는이 술어를 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 ()가 함수 매개 변수로서 왜 괜찮은지 잘 모르겠습니다.