Мне нужно проверить, начинается ли строка std: с «xyz». Как мне это сделать, не перебирая всю строку и не создавая временные строки с помощью substr ().
90
Я бы использовал метод сравнения:
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()); }
Это обеспечивает более простой интерфейс для клиентского кода и совместимо с большинством контейнеров стандартной библиотеки.
источник
Обратите внимание на библиотеку Boost String Algo , которая имеет ряд полезных функций, таких как 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
.