Сравнение двух строк c++
Допустим у меня есть список фамилий. Мне нужно сделать поиск фамилий по нескольким первым буквам и вывести ее на экран.
Допустим у меня есть список фамилий. Мне нужно сделать поиск фамилий по нескольким первым буквам и вывести ее на экран.
Вам нужно пройти по списку и выделить строки, начинающиеся второй строкой. Таким образом, задача сводится, фактически, к проверке, является ли одна строка префиксом другой.
Проверить, является ли одна строка префиксом другой можно многими способами.
Простейший, собственно средствами самого 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).
Рис.1. Пример префискного дерева для слов: "A", "to", "tea", "ted", "ten", "i", "in", and "inn", Источник: Wikipedia
Поиск по префиксному дереву будет намного эффективнее: в нормальном случае O(1), в худшем O(N).
Естественно, прибегать к помощи сложных структур данных имеет смысл только того, когда это оправдано. В простейшием случае достаточно будет простейшей прохода по списку и проверки строк на префиксы.
Наиболее простая проверка является ли строка "hello" началом строки str:
if (str.find("hello") == 0)