2012-12-03 4 views
0

필자는 자체 iterator 클래스를 정의했다. 어떻게 든 std :: string에 연결할 수있어서 std :: string 같은 종류의 인터페이스를 다시 구현하지 않아도됩니까? std :: basic_string의 템플릿 인수를 확인했지만이 종류의 것을 취하지는 않습니다.std :: string과 함께 자체 iterator 사용하기

+1

왜 이렇게 하시겠습니까? 'itd :: string'의 반복자 ('char *')가하지 않는 반복자 클래스는 무엇입니까? –

+0

이터레이터는 UTF8과 같은 문자 인코딩을 알고 있지만 std :: string은 그렇지 않습니다. 문자 인코딩을 알고있는 다른 C++ std :: string 기반 구현을 찾을 수 없습니다. – Aarkan

답변

1

하나의 아이디어는 이터레이터를 반환하는 begin(std::string)end(std::string) 함수를 제공하는 것입니다. 이것들은 반복자를 기대하는 모든 장소에서 사용될 수 있습니다.

begin() 자유 기능 스타일은 from c++11 onwards입니다.

+2

이 함수를 자신의 네임 스페이스에 넣을 수는 있지만 찾을 수 있습니까? Argument Dependent Lookup은 _your_ namespace를 검색하지 않습니다. – MSalters

+0

@MSalters가 내 네임 스페이스를 검색하지 못할 이유가 있습니까? 그것은 네임 스페이스에 있어야 할 필요는 없으며, 글로벌 네임 스페이스는 그렇게해야합니다. –

+0

이것은 적절한 begin() 멤버 함수를 노출하지 않고 반복 할 수있는 클래스에 std :: begin의 맞춤식 특수화를 제공 할 수있는 특별한 경우에 불과합니다. 권리? –

0

반복자 쌍을 취할 std :: string에 대한 오버로드 된 생성자가 있습니다. 그것은 작동하지만 복사본을 만듭니다. 그것은 물론 당신이 할 수있는 최선입니다. std::string 개체 내부에 작은 문자열 최적화 인 char[N]이있는 구현을 고려해보십시오. 그것은 매우, 아주 가능성이 귀하의 메모리 레이아웃과 호환되지 않습니다.

관련 문제