2011-02-03 3 views
67

된 약어에 같은 문자열의 마지막 문자를 점점 더 우아한 방법이 있는지 궁금 해서요 받기 존재하기. 거기에 상응하는 것이 있습니까? C++ 03, std::string::back가 인해 감독에 사용할 수 없습니다에서성병의 마지막 요소 : 문자열

char ch = myStr.back(); 

,하지만 당신은 reverse_iterator를 역 참조하여이 문제를 가져올 수 있습니다

+0

필자는 제공된 기능을 사용하여 쉽게 할 수 있기 때문에 필요하지는 않다고 생각합니다. –

+4

이 인수는 컨테이너 클래스에도 적용됩니다. – Deve

답변

100

는 C++ 11에서는 back 멤버 함수를 사용할 수 있습니다 당신은 rbegin에서 돌아 오기 :이 도움이

char ch = *myStr.rbegin(); 

희망!

+10

back() 함수가 C++ 11에 추가되었습니다. – eddi

+1

@ eddi- 그 점을 지적 해 주셔서 감사합니다! 그에 따라 내 대답을 업데이트했습니다. – templatetypedef

+0

참고 : g ++이'back()'이 사용 가능하도록'--std = C++ 11 '을 사용하도록 컴파일해야했습니다. – JulianHarty

2

*(myString.end() - 1) 어쩌면? 그것은 정확하게 우아하지도 않습니다.

python-esque myString.at(-1)은 이미 부풀어 오른 클래스를 너무 많이 요구할 것입니다.

20

당신은 아마 이런 걸 먼저 문자열의 길이를 확인하고 싶지 :

if (!myStr.empty()) 
{ 
    char lastChar = *myStr.rbegin(); 
} 
+2

길이를 확인할 필요가 없습니다. 빈 문자열이면 lastChar에 '\ 0'이 저장됩니다. –

+2

@ MarkLoeser : 그건 사실이 아닙니다. '* myStr.end()'는 myStr [myStr.size()]와 다릅니다! 그리고, 그렇다고해도 'myStr.rbegin()'은 빈 문자열에서 명백하게 무효 인 myStr.end() - 1과 동일하다. –

7

당신은 함수 템플릿 back을 쓸 수를 그 일반 컨테이너에 대한 멤버 함수 및 구현하는 정상적인 기능에 위임 문자열에 대한 누락 된 기능 :

template <typename C> 
typename C::reference back(C& container) 
{ 
    return container.back(); 
} 

template <typename C> 
typename C::const_reference back(const C& container) 
{ 
    return container.back(); 
} 

char& back(std::string& str) 
{ 
    return *(str.end() - 1); 
} 

char back(const std::string& str) 
{ 
    return *(str.end() - 1); 
} 

그런 다음 당신은 그냥 foo 여부를 걱정하지 않고 back(foo) 말할 수는 문자열 또는 벡터이다.

관련 문제