Я знаю, что я не первый, кто поднимает проблему с обратными итераторами, пытающимися вызвать метод erase () для строк.Однако я не смог найти хороших способов обойти это.
Я читаю содержимое файла, который содержит несколько слов.Когда я читаю слово, я хочу передать его функции, которую я назвал stripPunct.Тем не менее, я ТОЛЬКО хочу убрать пунктуацию в начале и конце строки, а не в середине.
Так, например:
(слово) should strip '('и') 'в результате просто слово
не! должно убрать'! 'в результате просто не
Итак, моя логика (которую, я уверен, можно улучшить) состояла в том, чтобы иметь два цикла while, один из которых начинается в конце, а другой - в начале, проходяи стирание до тех пор, пока оно не достигнет непунктуации.
void stripPunct(string & str) {
string::iterator itr1 = str.begin();
string::reverse_iterator itr2 = str.rbegin();
while ( ispunct(*itr1) ) {
str.erase(itr1);
itr1++;
}
while ( ispunct(*itr2) ) {
str.erase(itr2);
itr2--;
}
}
Однако, очевидно, это не работает, потому что erase () требует регулярного итератора, а не reverse_iterator.Но в любом случае, я чувствую, что эта логика довольно неэффективна.
Кроме того, я попытался вместо reverse_iterator использовать обычный итератор, начиная с str.end (), затем уменьшив его, но он говорит, что не может разыменовать итератор, если я запускаю его с str.end ().
Может кто-нибудь помочь мне с хорошим способом сделать это?Или, может быть, указать обходной путь для того, что у меня уже есть?
Заранее большое спасибо!
------------------ [РЕДАКТИРОВАТЬ] ----------------------------
нашел решение, хотя это может быть не лучшим решением:
// Call the stripPunct method:
stripPunct(str);
if ( !str.empty() ) { // make sure string is still valid
// perform other code
}
А вот метод stripPunct:
void stripPunct(string & str) {
string::iterator itr1 = str.begin();
string::iterator itr2 = str.end();
while ( !(str.empty()) && ispunct(*itr1) )
itr1 = str.erase(itr1);
itr2--;
if ( itr2 != str.begin() ) {
while ( !(str.empty()) && ispunct(*itr2) ) {
itr2 = str.erase(itr2);
itr2--;
}
}
}