답변:
변경되지 않는 버전의 경우 :
st = myString.substr(0, myString.size()-1);
st = st.substr(0, st.size()-1)
. 그러나 여전히 올바른 방식으로 보이지는 않습니다. 올바른 방법은이 작업을위한 함수를 사용하는 것입니다. 그것은 지우기 ()라고하며 코드는 다음과 같습니다 st.erase(st.size()-1)
. 이를 "돌연변이 버전"이라고합니다.
pop_back
C ++ 03에는 존재하지 않았 음) 또한 내부 수정이기도합니다 (그리고 OP는 그가 원 하던지 여부를 명확하게 밝히지 않았습니다 ...) 그런 그는이 하지만 유일하게 가능한 하나의 정답을.
C ++ 11을 사용하는 경우 간단한 솔루션. 아마 O (1) 시간 :
st.pop_back();
if (str.size () > 0) str.resize (str.size () - 1);
std :: erase 대안은 좋지만 "-1"(크기 또는 종료 반복자를 기반으로 함)을 좋아합니다. 의도를 표현하는 데 도움이됩니다.
BTW-실제로 std :: string :: pop_back이 없습니까? -이상해 보인다.
std::string::pop_back
C ++ 03 에는 없습니다 . 그러나 C ++ 0x에 추가되었습니다.
resize
크기 조정 기능이며 메모리를 늘리는 다른 기능은 더 이상 필요하지 않습니다. 예를 들어, resize
더 작은 크기로 예약하면 예약 된 메모리가 줄어들지 않습니다 . 나는 당신의있는 거 생각 생각 reserve
적어도, 수 에 요구한다면, 할당 된 메모리를 줄일를 -보고 여기에 크기를 조정 하고 여기에 예약 .
buf.erase(buf.size() - 1);
이것은 문자열이 비어 있지 않다는 것을 알고 있다고 가정합니다. 그렇다면 out_of_range
예외 가 발생합니다.
size()
대신에 무엇이 더 낫 end()
습니까?
string s("abc");
, 지우고 나면 작동하는 것처럼 보입니다. cout<<s; // prints "ab"
그러나 마지막 문자는 여전히 있습니다 cout<<s[2]; // still prints 'c'
.
str[str.length()-1] = 0; str.erase(str.end()-1);
s[2]
는 불법입니다.
C ++ 11을 사용하면 길이 / 크기가 필요하지 않습니다. 문자열이 비어 있지 않으면 다음을 수행 할 수 있습니다.
if (!st.empty())
st.erase(std::prev(st.end())); // Erase element referred to by iterator one
// before the end
길이가 0이 아닌 경우에도
str[str.length() - 1] = '\0';
\0
설정해도 문자열 길이는 변경되지 않습니다. str.length()
정확하지 않습니다.