Сравнение двух строк c++

Рейтинг: 0Ответов: 2Опубликовано: 18.04.2015

Допустим у меня есть список фамилий. Мне нужно сделать поиск фамилий по нескольким первым буквам и вывести ее на экран.

Ответы

▲ 4Принят

Вам нужно пройти по списку и выделить строки, начинающиеся второй строкой. Таким образом, задача сводится, фактически, к проверке, является ли одна строка префиксом другой.

Проверить, является ли одна строка префиксом другой можно многими способами.

Простейший, собственно средствами самого std::string:

X.find(Y) == 0
// что фактически означает std::string(X).find(Y) == 0

Самодельный:

bool isPrefix(string const& s1, string const&s2)
{
    const char*p = s1.c_str();
    const char*q = s2.c_str();
    while (*p&&*q)
        if (*p++!=*q++)
            return false;
    return true;
}

С помощью std::mismatch:

std::string s1("foo");
std::string s2("foobar");

auto res = std::mismatch(s1.begin(), s1.end(), s2.begin());

if (res.first == s1.end())
{
  // s1 префикс s2
}

С помощью string::compare:

bool match = (0==s1.compare(
        0, min(s1.length(), s2.length()), 
    s2, 0, min(s1.length(), s2.length())));

Если поиск по списку выполняется регулярно, есть смысл реорганизовать его в некую структуру данных, позволяющую выполнять поиск более эффективно.

Наиболее подходящей для решения данной задачи было бы префиксное дерево (trie).

Пример префискного дерева для слов: "A", "to", "tea", "ted", "ten", "i", "in", and "inn", Источник: Wikipedia

Рис.1. Пример префискного дерева для слов: "A", "to", "tea", "ted", "ten", "i", "in", and "inn", Источник: Wikipedia

Поиск по префиксному дереву будет намного эффективнее: в нормальном случае O(1), в худшем O(N).

Естественно, прибегать к помощи сложных структур данных имеет смысл только того, когда это оправдано. В простейшием случае достаточно будет простейшей прохода по списку и проверки строк на префиксы.

▲ 2

Наиболее простая проверка является ли строка "hello" началом строки str:

if (str.find("hello") == 0)