cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Добавить метод "split" в класс std::string #466

Closed aburmagin closed 2 years ago

aburmagin commented 2 years ago

Во множестве языков, таких как

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.

Пример использования:

#include <string>

int main(){
std::string string = "foo,bar,baz";
std::vector<std::string> tokens = string.split(',');

for (const auto& token: tokens)
    std::cout << token << std::endl;

return 0;
}
Output:
foo
bar
baz

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

tuminsky commented 2 years ago

В C++20 есть split_view: https://en.cppreference.com/w/cpp/ranges/split_view

oficsu commented 2 years ago

Как уже много раз упоминалось, проблема в том, что дизайн split каждый разработчик видит немного иначе, чем другие

Кто-то хочет split по одному символу, кто-то по строке, кто-то по любому символу в строке. Кто-то хочет легковесный split, возвращаеющий вектор из std::string_view, кто-то хочет получить копии строк в векторе, кого-то даже вектор не устроит. Кому-то нужна обработка ошибок через исключения, кого-то и коды ошибок устроят, а кто-то хочет поддержку монадических операций

В таких условиях написать split, способный удовлетворить полностью хотя бы небольшую часть разработчиков крайне сложно, а если вы не удовлетворите запросы большинства — все продолжат писать свой собственный split и ничего не изменится, кроме возросшей нагрузки на разработчиков стандартных библиотек и в таком случае неразумно даже тратить время на написание самого предложения. Поэтому, если вы заинтересованы в предложении, вам придётся полностью разработать дизайн split, который устроит большинство, а ещё лучше — всех. Кажется, пока ещё это никому не удалось, так что вы бы могли быть первым :)

bakwc commented 2 years ago

Кто-то хочет split по одному символу, кто-то по строке, кто-то по любому символу в строке

Сплит по одному символу и сплит по строке решается перегрузкой. Сплит по любому символу выглядит странно.

В таких условиях написать split, способный удовлетворить полностью хотя бы небольшую часть разработчиков крайне сложно

Для любителей string_view уже предложили split_view выше. Кажется что процентов 80 разработчиков устроит split который предложил автор выше.

apolukhin commented 2 years ago

В C++23 починили split_view с бэкпортом фикса в C++20. Им теперь удобно пользоваться для строк т.к. теперь он возвращает continuous итераторы из которых можно создавать string_view.

bakwc commented 2 years ago

Как будет выглядеть пример для std::string (не для string_view)?