Мені потрібно перевірити, чи std: рядок починається з "xyz". Як це зробити без пошуку по всьому рядку або створення тимчасових рядків за допомогою substr ().
Відповіді:
Я б використав метод порівняння:
std::string s("xyzblahblah");
std::string t("xyz")
if (s.compare(0, t.length(), t) == 0)
{
// ok
}
Підхід, який, можливо, більше відповідає духу Стандартної бібліотеки, полягає у визначенні власного алгоритму begin_with.
#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());
}
Це забезпечує простіший інтерфейс до коду клієнта і сумісний з більшістю контейнерів Standard Library.
Зверніться до бібліотеки String Algo Boost , яка має ряд корисних функцій, таких як start_with, istart_with (нечутливий до регістру) тощо. Якщо ви хочете використовувати лише частину бібліотек boost у своєму проекті, тоді ви можете скористатися утилітою bcp для копіювання потрібні лише файли
Здається, std :: string :: start_with знаходиться всередині C ++ 20, тим часом std :: string :: find може бути використаний
std::string s1("xyzblahblah");
std::string s2("xyz")
if (s1.find(s2) == 0)
{
// ok, s1 starts with s2
}
std::string::compare
оскільки це дозволяє легко перевірити, чи рядок починається з літералу, не повторюючи сам літерал, щоб знайти його розмір. І дякую за вказівку на пряме рішення C ++ 20.
Я відчуваю, що не повністю розумію ваше запитання. Схоже, це повинно бути тривіально:
s[0]=='x' && s[1]=='y' && s[2]=='z'
Це розглядає лише (максимум) перші три символи. Узагальнення для рядка, який невідомий під час компіляції, вимагатиме заміни вищезазначеного циклом:
// look for t at the start of s
for (int i=0; i<s.length(); i++)
{
if (s[i]!=t[i])
return false;
}
t
.