HDFS как хранилище файлов Liferay

Здесь много ужасных ответов, поэтому я добавлю свою (включая тестовую программу):

#include <string>
#include <iostream>
#include <cstddef>

template<typename StringFunction>
void splitString(const std::string &str, char delimiter, StringFunction f) {
  std::size_t from = 0;
  for (std::size_t i = 0; i < str.size(); ++i) {
    if (str[i] == delimiter) {
      f(str, from, i);
      from = i + 1;
    }
  }
  if (from <= str.size())
    f(str, from, str.size());
}


int main(int argc, char* argv[]) {
    if (argc != 2)
        return 1;

    splitString(argv[1], ',', [](const std::string &s, std::size_t from, std::size_t to) {
        std::cout << "`" << s.substr(from, to - from) << "`\n";
    });

    return 0;
}

Хорошие свойства:

  • Нет зависимостей (например, boost)
  • Не безумный однострочный
  • Легко понять (надеюсь)
  • Управляет пространством отлично
  • Не выделяет разбиения если вы этого не хотите, например вы можете обрабатывать их с помощью лямбда, как показано на рисунке.
  • Не добавлять символы по одному - должно быть быстро.
  • Если вы используете C ++ 17, вы можете изменить его для использования a std::stringview, а затем он не будет выполнять никаких распределений и должен быть очень быстрым.

Некоторые варианты дизайна, которые вы, возможно, захотите изменить:

  • Пусто записи не игнорируются.
  • Пустая строка будет вызывать f () один раз.

Пример входов и выходов:

""      ->   {""}
","     ->   {"", ""}
"1,"    ->   {"1", ""}
"1"     ->   {"1"}
" "     ->   {" "}
"1, 2," ->   {"1", " 2", ""}
" ,, "  ->   {" ", "", " "}
0
задан Andrey Samoylov 18 January 2019 в 18:53
поделиться