std :: string의 마지막 요소를 가져옵니다.


87

약어 또는 다음과 같은 문자열의 마지막 문자를 얻는 더 우아한 방법이 있는지 궁금합니다.

char lastChar = myString.at( myString.length() - 1 );

같은 myString.back()것이 존재하지 않는 것 같습니다. 동등한 것이 있습니까?


나는 그것이 필요하지 않다고 생각한다. 제공된 기능으로 꽤 쉽게 할 수 있기 때문이다.
Hoàng Long

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

답변:


130

C ++ 11 이상에서는 back멤버 함수를 사용할 수 있습니다 .

char ch = myStr.back();

C ++ 03에서는 std::string::back감독으로 인해 사용할 수 없습니다.하지만 다음 reverse_iterator에서 반환 된 값을 역 참조하여이 문제를 해결할 수 있습니다 rbegin.

char ch = *myStr.rbegin();

두 경우 모두 문자열에 실제로 적어도 하나의 문자가 있는지 확인하십시오! 그렇지 않으면 정의되지 않은 동작이 발생 하며 이는 나쁜 일입니다.

도움이 되었기를 바랍니다!


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

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

참고 : g ++를 사용 하려면 --std=c++11for back()로 컴파일해야 했습니다 .
JulianHarty 2017

@JulianHarty 그것은 대부분의 C ++ 11 기능에 해당됩니다. :-)
templatetypedef

22

먼저 문자열의 길이를 확인하고 다음과 같이 할 수 있습니다.

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

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

4
@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);
}

그러면 문자열인지 벡터 back(foo)인지 걱정하지 않고 말할 수 있습니다 foo.


2

*(myString.end() - 1)아마도? 그것도 우아하지 않습니다.

python-esque myString.at(-1)는 이미 부풀린 클래스를 너무 많이 요구합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.