Closed aburmagin closed 2 years ago
В C++20 есть split_view: https://en.cppreference.com/w/cpp/ranges/split_view
Как уже много раз упоминалось, проблема в том, что дизайн split
каждый разработчик видит немного иначе, чем другие
Кто-то хочет split
по одному символу, кто-то по строке, кто-то по любому символу в строке. Кто-то хочет легковесный split
, возвращаеющий вектор из std::string_view
, кто-то хочет получить копии строк в векторе, кого-то даже вектор не устроит. Кому-то нужна обработка ошибок через исключения, кого-то и коды ошибок устроят, а кто-то хочет поддержку монадических операций
В таких условиях написать split
, способный удовлетворить полностью хотя бы небольшую часть разработчиков крайне сложно, а если вы не удовлетворите запросы большинства — все продолжат писать свой собственный split
и ничего не изменится, кроме возросшей нагрузки на разработчиков стандартных библиотек и в таком случае неразумно даже тратить время на написание самого предложения. Поэтому, если вы заинтересованы в предложении, вам придётся полностью разработать дизайн split
, который устроит большинство, а ещё лучше — всех. Кажется, пока ещё это никому не удалось, так что вы бы могли быть первым :)
Кто-то хочет split по одному символу, кто-то по строке, кто-то по любому символу в строке
Сплит по одному символу и сплит по строке решается перегрузкой. Сплит по любому символу выглядит странно.
В таких условиях написать split, способный удовлетворить полностью хотя бы небольшую часть разработчиков крайне сложно
Для любителей string_view уже предложили split_view выше. Кажется что процентов 80 разработчиков устроит split который предложил автор выше.
В C++23 починили split_view с бэкпортом фикса в C++20. Им теперь удобно пользоваться для строк т.к. теперь он возвращает continuous итераторы из которых можно создавать string_view.
Как будет выглядеть пример для std::string (не для string_view)?
Во множестве языков, таких как
Java: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#split(java.lang.String)
C#: https://docs.microsoft.com/en-us/dotnet/api/system.string.split?view=net-5.0#System_String_Split_System_Char___
Python: https://docs.python.org/3/library/stdtypes.html#str.split
Rust: https://doc.rust-lang.org/std/primitive.str.html#method.split
Go: https://pkg.go.dev/strings#Split
уже есть метод, позволяющий разделить строку на подстроки с использованием разделителя (сепаратора)
Очень хотелось бы видеть такой же метод в классе строки языка C++.
Идея будет полезна в большом числе случаев, учитывая то, что это достаточно популярная задача.
На данный момент для её решения используется множество разных способов, выглядящих громоздко: https://stackoverflow.com/questions/14265581/parse-split-a-string-in-c-using-string-delimiter-standard-c
Метод принимает один параметр - разделитель, тип которого - char или std::string.
Пример использования:
В случае невозможности разделения строки можно кидать исключение, либо придумать другой способ обработки ошибки.