std:array<char, N> Pointer auslesen



  • Ich habe einen String Tokenizer, der einen Satz vom Typ char* in std::strings zerlegt:

    class StringTokenizer {
    public:
      StringTokenizer(const char* begin, const char* end) :
        m_token_begin(begin),
        m_token_end(begin),
        m_end(end) {}
    
      bool GetNext() {
        // ...
        return true;
      }
    
      std::string Token() const {
        return std::string(m_token_begin, m_token_end);
      }
    
    private:
      const char* m_token_begin;
      const char* m_token_end;
      const char* m_end;
    };
    

    Der Satz kann max zB 8192 Zeichen (mit Endekennung etc.) enthalten und ist ein std:array:

    void Parse() {
      std::array<char, 1 << 13> buffer;  // 8192
    
      // Input loop
      while (fgets(buffer.data(), sizeof(buffer), stdin) != nullptr) {
        // Remove newline if existing
        if (buffer[strlen(buffer.data()) - 1] == '\n') {
          buffer[strlen(buffer.data()) - 1] = 0;
        }
    
        StringTokenizer st(buffer.data(), buffer.data() + strlen(buffer.data()));
    
        // Token loop
        while (st.GetNext()) {
          std::string token = st.Token();
          // ...
        }  // while
      }  // while
    }
    

    Allerdings gefällt mir das ständige buffer.data() nicht besonders. Geht das auch einfacher unter Verwendung von std::array?



  • Es bringt hier keinerlei Vorteil, std::array anstatt einem rohen Array zu verwenden. Ich würde aber darüber nachdenken, in einen std::string einzulesen, dann sparst du dir die redundanten strlen-Aufrufe.

    Genauso ist es unnötig, in der Methode Token() einen std::string zurückzugeben (das wäre eine Fall für StringRef o.Ä.).


Anmelden zum Antworten