2014-11-12 12 views
6

Załóżmy, że chcę usunąć wszystko po ostatnim "*" (na przykład) w ciągu znaków. Wiedząc, że mogę podjąć następujące oczywiste dla tego łańcucha:Eleganckie usuwanie części ciągu znaków po ostatnim wystąpieniu znaku

  1. zawsze będzie zawierać „*”
  2. może ona zawierać więcej niż jedną „*”
  3. Będzie Nigdy nie uruchamiać lub kończyć się '*'

Jaki jest najczystszy i/lub najkrótszy sposób usunięcia wszystkiego poza ostatnim "*", plus sam z tylko podstawowymi bibliotekami?

Odpowiedz

17

wyraziłeś założenia:

s.erase(s.rfind('*')); 

bez założenia, że ​​zawiera on co najmniej jedną *:

auto pos = s.rfind('*'); 
if (pos != std::string::npos) { 
    s.erase(pos); 
} 
+0

schludne. Dodatkowe punkty za dodatkowy bit. –

+0

Powiedz. Jaka jest różnica między .rfind() i .find_last_of()? –

+0

Chociaż jestem niebezpiecznie blisko spamowania, znalazłem odpowiedź na to ostatnie pytanie: s.rfind ("abc") znajdzie ostatnie wystąpienie ciągu "abc", a s.find_last_of ("abc") znajdzie ostatnie wystąpienie "a", "b" lub "c". –

Powiązane problemy