[Программирование, C++] Небольшие, но важные функции (перевод)
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Будущих студентов курса "C++ Developer. Professional" приглашаем принять участие в открытом уроке "Backend на современном С++".
А пока делимся традиционным переводом материала.
Начиная с C++20 в несколько стандартных контейнеров, включая std::map, std::set и std::string, были добавлены некоторые очень полезные функции для поиска. Необходимость в них существовала уже в течении достаточно долгого времени, и мне приятно видеть, что комитет наконец признал их важность. Надеюсь, это только начало серии замечательных дополнений.Map и setТиповая операция при работе с map — проверить, существует ли конкретный ключ. Как это сделать в C++17? Все просто:
std::map<int, std::string> m{ {1, "one"}, {2, "two"}, {3, "three"} };
if (m.find(1) != m.end())
{
std::cout << "key found!\n";
}
Хотя это может быть достаточно просто, это отнюдь совсем не удобно для пользователя. По этой причине многие пишут свою собственную функцию contains(), которая принимает map и ключ и возвращает логическое значение, указывающее, содержит ли map ключ. В C++20 это больше не нужно, т.к. std::map имеет родной метод contains().
std::map<int, std::string> m{ {1, "one"}, {2, "two"}, {3, "three"} };
if (m.contains(1))
{
std::cout << "key found!\n";
}
То же верно и для std::set
std::set<int> s{ 1, 2, 3 };
if (s.contains(1))
{
std::cout << "key found!\n";
}
Даже больше, в C++20 функция contains() была добавлена к целому ряду типов:
- std::map
- std::multimap
- std::unordered_map
- std::unordered_multimap
- std::set
- std::multiset
- std::unordered_set
- std::unordered_multiset
СтрокиПохожая проблема актуальна и для строк. Иногда нам нужно узнать, содержит ли строка другую строку. Вот как это делается в C++17:
std::string text{"The quick brown fox jumps over the lazy dog"};
if (text.find("fox") != std::string::npos)
{
std::cout << "fox found!\n";
}
Частный случай, связанный со строками, — это поиск подстроки в начале и в конце строки. Поиск в начале относительно прост:
if (text.find("The quick") == 0)
{
std::cout << "right start\n";
}
Но для поиска в конце требуется вспомогательная функция. Возможная реализация такова:
bool ends_with(std::string const & text, std::string const & substr)
{
if (substr.size() > text.size()) return false;
return std::equal(text.begin() + text.size() - substr.size(), text.end(), substr.begin());
}
Что можно использовать следующим образом:
if (ends_with(text, "lazy dog"))
{
std::cout << "right end\n";
}
(Примечание: Вы можете найти альтернативные реализации этой функции здесь)C++20 значительно упростил ситуацию, где std::basic¨C16Cstring¨C17Cwith() и ends¨C18Cwith("The quick"))
if (text.starts_with("The quick"))
{
std::cout << "right start\n";
}
if(text.ends_with("lazy dog"))
{
std::cout << "right end\n";
}
Однако в C++20 есть достаточно большое упущение: функция для проверки того, содержит ли строка подстроку. Во время последнего заседания комитета ISO C++, такой метод был добавлен в C++23 (P1679). Это позволит нам написать следующее:
if (text.contains("fox"))
{
std::cout << "fox found!\n";
}
Именно так мы всегда и хотели писать код.
Но…Вы должны помнить, что эти новые строковые функции чувствительны к регистру. Они не принимают предикат, позволяющий настроить способ выполнения поиска. Следовательно, если вам нужно выполнить поиск без учета регистра, вам все равно нужно будет реализовать это самостоятельно. Возможные реализации contains(), startwith() и endwith(), которые выполняют поиск без учета регистра, показаны ниже:
bool contains_ci(std::string const & text, std::string const & substr)
{
if (substr.length() > text.length()) return false;
auto it = std::search(
text.begin(), text.end(),
substr.begin(), substr.end(),
[](char ch1, char ch2) {
return std::toupper(ch1) == std::toupper(ch2); });
return it != text.end();
}
bool starts_with_ci(std::string const& text, std::string const& substr)
{
if (substr.length() > text.length()) return false;
auto it = std::search(
text.begin(), text.begin() + substr.length(),
substr.begin(), substr.end(),
[](char ch1, char ch2) {
return std::toupper(ch1) == std::toupper(ch2); });
return it == text.begin();
}
bool ends_with_ci(std::string const& text, std::string const& substr)
{
if (substr.length() > text.length()) return false;
auto it = std::search(
text.rbegin(), text.rbegin() + substr.length(),
substr.rbegin(), substr.rend(),
[](char ch1, char ch2) {
return std::toupper(ch1) == std::toupper(ch2); });
return it == text.rbegin();
}
А использовать их можно следующим образом:
if (contains_ci(text, "FOX"))
{
std::cout << "fox found!\n";
}
if (starts_with_ci(text, "THE QUICK"))
{
std::cout << "right start\n";
}
if (ends_with_ci(text, "LAZY DOG"))
{
std::cout << "right end\n";
}
Узнать подробнее о курсе "C++ Developer. Professional".
Записаться на открытый урок "Backend на современном С++".
Читать ещё:
===========
Источник:
habr.com
===========
===========
Автор оригинала: Marius Bancila
===========Похожие новости:
- [Программирование, Управление разработкой, Управление персоналом, Карьера в IT-индустрии] О плюсах парного программирования
- [Программирование, CRM-системы] Интегрируем web-телефон в свою систему
- [Python, Программирование] Как работает память в Python
- [Разработка игр, Машинное обучение, Карьера в IT-индустрии] Семь талантливых стажеров AI@Unity 2020. Часть 1 (перевод)
- [C++, Компиляторы, C, Разработка под MacOS, Процессоры] Компиляция C/C++ на Apple M1 (перевод)
- [Высокая производительность, JavaScript, Программирование, TypeScript] Производительность TypeScript (перевод)
- [Программирование, Java, Тестирование веб-сервисов, Тестирование мобильных приложений] Рекомендации по использованию IF в Java (перевод)
- [Информационная безопасность, Python, Программирование] Проверим тысячи пакетов PyPI на вредоносность (перевод)
- [Программирование, Управление разработкой, Управление проектами, Управление продуктом] Оценка трудозатрат в разработке ПО для начинающих (перевод)
- [Python, Программирование, Научно-популярное, Космонавтика, Астрономия] Кодируем и декодируем сообщение для внеземных цивилизаций
Теги для поиска: #_programmirovanie (Программирование), #_c++, #_stl, #_c++, #_blog_kompanii_otus._onlajnobrazovanie (
Блог компании OTUS. Онлайн-образование
), #_programmirovanie (
Программирование
), #_c++
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 08:03
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Будущих студентов курса "C++ Developer. Professional" приглашаем принять участие в открытом уроке "Backend на современном С++".
А пока делимся традиционным переводом материала. std::map<int, std::string> m{ {1, "one"}, {2, "two"}, {3, "three"} };
if (m.find(1) != m.end()) { std::cout << "key found!\n"; } std::map<int, std::string> m{ {1, "one"}, {2, "two"}, {3, "three"} };
if (m.contains(1)) { std::cout << "key found!\n"; } std::set<int> s{ 1, 2, 3 };
if (s.contains(1)) { std::cout << "key found!\n"; }
std::string text{"The quick brown fox jumps over the lazy dog"};
if (text.find("fox") != std::string::npos) { std::cout << "fox found!\n"; } if (text.find("The quick") == 0)
{ std::cout << "right start\n"; } bool ends_with(std::string const & text, std::string const & substr)
{ if (substr.size() > text.size()) return false; return std::equal(text.begin() + text.size() - substr.size(), text.end(), substr.begin()); } if (ends_with(text, "lazy dog"))
{ std::cout << "right end\n"; } if (text.starts_with("The quick"))
{ std::cout << "right start\n"; } if(text.ends_with("lazy dog")) { std::cout << "right end\n"; } if (text.contains("fox"))
{ std::cout << "fox found!\n"; } Но…Вы должны помнить, что эти новые строковые функции чувствительны к регистру. Они не принимают предикат, позволяющий настроить способ выполнения поиска. Следовательно, если вам нужно выполнить поиск без учета регистра, вам все равно нужно будет реализовать это самостоятельно. Возможные реализации contains(), startwith() и endwith(), которые выполняют поиск без учета регистра, показаны ниже: bool contains_ci(std::string const & text, std::string const & substr)
{ if (substr.length() > text.length()) return false; auto it = std::search( text.begin(), text.end(), substr.begin(), substr.end(), [](char ch1, char ch2) { return std::toupper(ch1) == std::toupper(ch2); }); return it != text.end(); } bool starts_with_ci(std::string const& text, std::string const& substr) { if (substr.length() > text.length()) return false; auto it = std::search( text.begin(), text.begin() + substr.length(), substr.begin(), substr.end(), [](char ch1, char ch2) { return std::toupper(ch1) == std::toupper(ch2); }); return it == text.begin(); } bool ends_with_ci(std::string const& text, std::string const& substr) { if (substr.length() > text.length()) return false; auto it = std::search( text.rbegin(), text.rbegin() + substr.length(), substr.rbegin(), substr.rend(), [](char ch1, char ch2) { return std::toupper(ch1) == std::toupper(ch2); }); return it == text.rbegin(); } if (contains_ci(text, "FOX"))
{ std::cout << "fox found!\n"; } if (starts_with_ci(text, "THE QUICK")) { std::cout << "right start\n"; } if (ends_with_ci(text, "LAZY DOG")) { std::cout << "right end\n"; } Узнать подробнее о курсе "C++ Developer. Professional".
Записаться на открытый урок "Backend на современном С++". =========== Источник: habr.com =========== =========== Автор оригинала: Marius Bancila ===========Похожие новости:
Блог компании OTUS. Онлайн-образование ), #_programmirovanie ( Программирование ), #_c++ |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 08:03
Часовой пояс: UTC + 5