Muszę sprawdzić, czy std: string zaczyna się od "xyz". Jak to zrobić bez przeszukiwania całego łańcucha lub tworzenia tymczasowych łańcuchów z substr().std :: porównanie ciągów (sprawdź, czy ciąg zaczyna się od innego ciągu)
Odpowiedz
użyłbym porównać metoda:
std::string s("xyzblahblah");
std::string t("xyz")
if (s.compare(0, t.length(), t) == 0)
{
// ok
}
Czuję, że nie w pełni rozumiem twoje pytanie. Wygląda na to, że powinno być trywialnie:
s[0]=='x' && s[1]=='y' && s[2]=='z'
To dotyczy tylko (najwyżej) pierwszych trzech znaków. Uogólnienie na sznurku, który jest znany w czasie kompilacji będzie wymagać, aby zastąpić wyżej z pętlą:
// look for t at the start of s
for (int i=0; i<s.length(); i++)
{
if (s[i]!=t[i])
return false;
}
Spójrz na impuls za String Algo biblioteki, która posiada szereg przydatnych funkcji, takich jak starts_with, istart_with (niewrażliwy przypadek), itd. Jeśli chcesz użyć tylko część bibliotek Boost w projekcie, a następnie można użyć narzędzia bcp skopiować tylko potrzebne pliki
podejście to może być więcej trzymanie się duchem Biblioteki Standardowej byłoby zdefiniowanie własnego algorytmu zaczynającego od algorytmu.
#include <algorithm>
using namespace std;
template<class TContainer>
bool begins_with(const TContainer& input, const TContainer& match)
{
return input.size() >= match.size()
&& equal(match.begin(), match.end(), input.begin());
}
Daje to prostszy interfejs do kodu klienta i jest kompatybilny z większością pojemników Biblioteka standardowa.
Zapomniałem o porównaniu - jest to najlepsza metoda, ale nie ma potrzeby używania c_str (0, aby uzyskać ciąg znaków –
Możesz również napisać ciąg s ("xyz") == "xyz. :) – Skurmedel
Neil, masz absolutną rację, edytowałem odpowiedź i usunąłem c_str() zadzwoń – Wacek