Feedback: split() Funktion aus python



  • Hallo zusammen,

    ich habe versucht die split() Funktion aus python in C++ zu implementieren (mehr oder weniger zur Übung).

    Würde mich sehr freuen, falls ihr Verbesserungsvorschläge habt. Ich habe auch noch eine Frage: Lohnt es sich eurer Meinung nach, Variablen so lokal wie möglich zu halten, obwohl dadurch (m. M. n.) die Lesbarkeit geringer wird?

    static constexpr auto ws = " \t\v\r\n\f";
    
    static vector<string> split_ws(string_view str, size_t max)
    {
        vector<string> result;
        for (size_t start = str.find_first_not_of(ws), splits = 0; start != string::npos; ++splits)
        {
            if (auto end = str.find_first_of(ws, start); end != string::npos && splits < max)
            {
                result.emplace_back(str.substr(start, end - start));
                start = str.find_first_not_of(ws, end);
            }
            else
            {
                result.emplace_back(str.substr(start));
                break;
            }
        }
        return result;
    }
    
    static vector<string> split_sep(string_view str, string_view sep, size_t max)
    {
        vector<string> result;
        for (size_t start = 0, splits = 0; start < str.size(); ++splits)
        {
            if (size_t end = str.find(sep, start); end != string::npos && splits < max)
            {
                result.emplace_back(str.substr(start, end - start));
                start = end + sep.size();
            }
            else
            {
                result.emplace_back(str.substr(start));
                break;
            }
        }
        return result;
    }
    
    vector<string> split(string_view str, string_view sep, size_t maxsplit = std::numeric_limits<size_t>::max())
    {
        return sep.empty() ? split_ws(str, maxsplit) : split_sep(str, sep, maxsplit);
    }
    


  • Bei deiner ersten Funktion könntest du bei auto end = str.find_first_of(ws, start); ein start + 1 machen. Ansonsten siehts gut aus.



  • @harteware sagte in Feedback: split() Funktion aus python:

    mehr oder weniger zur Übung

    Wenn du was fertiges willst: ich finde absl::StrSplit ganz nett.

    Das boost::split finde ich dagegen nicht so toll, weil man a) keinen return hat und stattdessen den Ziel-string-vector übergeben muss und b) weil es nicht an Strings splitten kann.



  • @spiri sagte in Feedback: split() Funktion aus python:

    Bei deiner ersten Funktion könntest du bei auto end = str.find_first_of(ws, start); ein start + 1 machen. Ansonsten siehts gut aus.

    Danke für den Hinweis.

    @wob sagte in Feedback: split() Funktion aus python:

    Wenn du was fertiges willst: ich finde absl::StrSplit ganz nett.

    Ich mag halt die kleinen Header, die man mal schnell in ein Projekt einfügen kann. Abseil ist aber ganz nett, da sie CMake unterstützen. Leider scheint der Code nicht für MSYS2/mingw-w64 ausgelegt zu sein (da stimmen dann einige defines nicht und einige Funktionen sind undefiniert etc. Aber gut, ich bin eh lieber unter Linux unterwegs zum programmieren.

    EDIT: Meine Lösung ist noch lang nicht gut...

    std::vector<std::string> split_ws(const std::string& str)
    {
        std::istringstream stream{str};
        return {std::istream_iterator<std::string>{stream}, std::istream_iterator<std::string>{}};
    }
    

Anmelden zum Antworten