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.Ä.).