Std::string сравнение (проверьте, начинается ли строка с другой строки)

Мне нужно проверить, начинается ли строка std: "xyz". Как это сделать, не просматривая всю строку или создавая временные строки с помощью substr().

Ответ 1

Я бы использовал метод сравнения:

std::string s("xyzblahblah");
std::string t("xyz")

if (s.compare(0, t.length(), t) == 0)
{
// ok
}

Ответ 2

Подход, который может быть в большей степени совместим с духом Стандартной библиотеки, - это определить свой собственный алгоритм 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());
}

Это обеспечивает более простой интерфейс для клиентского кода и совместим с большинством контейнеров стандартной библиотеки.

Ответ 3

Посмотрите на библиотеку Boost String Algo, которая имеет ряд полезных функций, таких как starts_with, istart_with (без учета регистра) и т.д. Если вы хотите использовать только часть дополнительных библиотек в своем проекте, вы можете использовать утилиту bcp для копирования только необходимых файлов.

Ответ 4

Я чувствую, что не полностью понимаю ваш вопрос. Похоже, что это должно быть тривиально:

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;
}