Jawa / Говнокод #27313 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
private static String getMargin(final int size) {
        return "                                                                                                                             ".substring(0, 6 * size);
    }

Как создать пустую строку с заданной длиной...

Запостил: nekkiy nekkiy, (Updated )

Комментарии (31) RSS

  • в платной версии поддерживаются более длинные строки
    Ответить
  • это же оптимизация, циклы не тратятся - препроцессенная строка уже готова к использованию
    Ответить
    • ну да, там будет указатель на адрес и смещение в строковом литерале же
      Ответить
  • Отвратительно няэффективно.

    #include <array>
    #include <string_view>
    #include <iostream>
    
    template<size_t Size, auto MarginChar = ' '>
    struct Margin {
        using CharT = decltype(MarginChar);
        using MarginType = std::basic_string_view<CharT>;
    
        static constexpr MarginType getMargin() noexcept
        {
            return MarginType(_data.data(), _data.size());
        }
    
    private:
        template<typename T, T... Args>
        constexpr static auto _get_data_impl(std::integer_sequence<T, Args...>)
        {
            return std::array<CharT, Size>{(static_cast<void>(Args), MarginChar)...};
        }
    
        constexpr static auto _get_data() noexcept
        {
            return _get_data_impl(std::make_integer_sequence<size_t, Size>());
        }
    
        constexpr static inline auto _data = _get_data();
    };
    
    
    int main()
    {
        constexpr std::string_view margin10 = Margin<10, 'x'>::getMargin();
        std::cout << "Margin10 == " << margin10 << std::endl;
    }
    Ответить
    • Строковые литералы не шарятся при таком подходе, или я не понял рахитектуры?
      Ответить
      • Не шарятся, у каждой специализации Margin<> свой собственный "литерал" (статический массив чаров).
        Ответить
        • Не эквивалентно ОП-коду тогда. В ЙАЖА substring берёт слайс оригинальной строки вроде.
          Ответить
          • В Java Stringи иммутабельны, поэтому семантически это эквивалентно оригинальному коду (ну, кроме того, что Size надо умножить на 6).
            Ответить
                  • Нет, насколько я знаю, просто иммутабельные строки. Уровень документации у Java отвратителен, конечно: https://docs.oracle.com/javase/8/docs/api/java/lang/String.html
                    The String class represents character strings. All string literals in Java programs,
                    such as "abc", are implemented as instances of this class. Strings are constant;
                    their values cannot be changed after they are created. String buffers support
                    mutable strings.


                    Про substring() пишут ещё меньше:
                    Returns a string that is a substring of this string. The substring begins at
                    the specified beginIndex and extends to the character at index endIndex - 1.
                    Thus the length of the substring is endIndex-beginIndex.


                    На SO говорят (https://stackoverflow.com/questions/4679746/time-complexity-of-javas-substring), что "As of update 6 within Java 7's lifetime, the behaviour of substring changed to create a copy - so every String refers to a char[] which is not shared with any other object, as far as I'm aware. So at that point, substring() became an O(n) operation where n is the numbers in the substring".
                    Ответить
                    • > уровень документации у java отвратителен

                      Это ты ещё питоньи доки не читала...
                      Ответить
                      • Почему это всё надо искать на каких-то левых сайтах а не в документации на язык/jvm?
                        Ответить
                        • Потому что ты не должен знать как устроен сабстринг. Ты же всего лишь программист, а не создатель стандартной библиотеки языка. Зачем тебе низкоуровневые подробности, в которых ты всё равно ничего не поймешь?

                          Иди лучше веб-магазин на спринге пили
                          Ответить
                          • а кстати да, есть какой юзайкейс где очень важно что пiдстроки стали reference counted учитывая их иммудабельность?
                            Ответить
                • Хорошая попытка закосить под ньюфага, не знающего местной терминологии...
                  Ответить
      • Интересно, можно ли насфиначить такой шаблон, чтобы в пределах TU сгенерированные литералы были слайсами одного статического массива, длина которого выводилась бы автоматически. Ну, чтобы margin'ы разной длины не жрали память. Мой power level недостаточен T__T
        Ответить
        • Возможно через friend injection получится запилить глобалку с максимумом, а в конце файла объявить буфер.

          Но мой power level для этого тоже недостаточен.
          Ответить
        • > Интересно, можно ли насфиначить такой шаблон, чтобы в пределах TU сгенерированные литералы были слайсами одного статического массива, длина которого выводилась бы автоматически.

          Вам в тред про сортировку с суперпермутацией. https://govnokod.ru/24496

          Можно все иммутабельные строки попробовать сшить в одну иммутабельную зожатую мегастроку, и потом на нее тыкаться указателями с размером подстроки.
          Ответить
        • И в пределах одной TU это как-то анскильно, надо чтоб глобально на всю программу строк насобирать и зожать в одну
          Ответить
          • Не вижу там алгоритма нахождения самой короткой суперстроки, в которой есть все нужные подстроки.
            Ответить
    • Этот код не даёт мне нормально писать программы! Название эксепшена, который вылетает если обратиться не по тому индексу сложно запомнить, поэтому я всегда пользовался getMargin(9000), чтобы его вызвать. Как мне теперь быть, зачем было ломать то, что хорошо работало и упрощало жизнь?
      Ответить

Добавить комментарий

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8