На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Преобразование массива
    Цитата Majestio @
    Нужен компактный алгоритм на C++20 не выше
    :lol:

    Цитата Qraizer @
    Собрано на коленке.

    :facepalm: ты спецом так раздул код?

    Добавлено
    Цитата Qraizer @
    Кстати, Majestio, где тест с мульёном вложений подразделов? А то 3 как-то несерьёзно.

    Не не не ... я не пишу универсальную хрень - чисто разовый утиль. Написал-использовал-забыл.
      P.S. Выглядит громоздко. Зато тут полноценное обобщённое решение. Для любого другого представления просто доопределяем политику struct blah_blah_blah_Accessor и однострочно специализируем Selector<>. М-м-м... doTest() должен справиться и без настройки, ему лишь бы контейнер какой-нить с begin()/end() дали. Наверное...

      Добавлено
      Собственно решение на ~100 строк, и оно, поверь, даже в таком виде быстрее за счёт отсутствия тяжёлых в ран-тайме сущностей. При этом это два решения сразу. Остальные строки только запускают этот код на разных примерах
      Сообщение отредактировано: Qraizer -
        Цитата Qraizer @
        Зато тут полноценное обобщённое решение.

        Ну если только для академических целей ... :whistle:
          Цитата Majestio @
          Не не не ... я не пишу универсальную хрень - чисто разовый утиль. Написал-использовал-забыл.
          Ну и зря. Тут вся сложность в алгоритме компаратора. Sorter<>::operator() который. Написать его совсем не сложно. Меня заинтересовало именно обобщённое решение для различных представлений.

          Добавлено
          Потратил я, кстати, часа два. Сегодня после обеда решил передохнуть от дидлайна. Счас комментов только накидал.
            Цитата Qraizer @
            Ну и зря. Тут вся сложность в алгоритме компаратора.

            Ну что тут сказать ... я рад, что и ты тут нашел себе развлечение :lol:
              На вот для примера.
              ExpandedWrap disabled
                  std::list<std::valarray<int>> super({{1,12}, {2,4,15}, {111,1,1}, {3,4}, {1,1}});
                 
                  auto res = doTest(super);
                 
                  // вывод
                  for (const auto& i : res)
                  {
                    std::cout << '{';
                    for (const auto& j : i)
                      std::cout << ' ' << j << ' ';
                    std::cout << "};";
                  }
                  std::cout << std::endl;
              Список std::valarray<>ев. :lol: Всего-то понадобилось:
              ExpandedWrap disabled
                // стратегия для недоSIMDей
                struct ValArrayAccessor
                {
                  using value_type = std::valarray<int>;
                 
                  static size_t getSize(const value_type& cont)             { return cont.size();  }
                  static int    getItem(const value_type& cont, size_t idx) { return cont[idx];    }
                  static void   addItem(      value_type& cont, int    val)
                  {
                    value_type newCont(cont.size()+1);
                    std::slice toCopy(0, cont.size(), 1);
                 
                    newCont[toCopy] = cont[toCopy];
                    newCont[newCont.size()-1] = val;
                    std::swap(newCont, cont);
                  }
                };
                 
                template <>           struct Selector<std::valarray<int>>
                {
                  using ValueType = ValArrayAccessor;
                };
              Вроде даже работает.

              Добавлено
              Что там на очереди? std::queue<std::tuple<>>? :crazy:
                Цитата Qraizer @
                Собрано на коленке. Доводить до ума некогда, сорри.

                Попробовал откомпилячить в С++20 - выдает ошибки :(

                Штото типа:
                ExpandedWrap disabled
                  main.cpp: In function ‘auto doTest(const T&)’:
                  main.cpp:108:7: error: need ‘typename’ before ‘decltype (product)::value_type’ because ‘decltype (product)’ is a dependent scope
                    108 |       decltype(product)::value_type newItem;            // чем добавлять все, кроме последнего
                        |       ^~~~~~~~~~~~~~~~~
                  main.cpp:108:36: error: expected ‘;’ before ‘newItem’
                    108 |       decltype(product)::value_type newItem;            // чем добавлять все, кроме последнего
                        |                                    ^~~~~~~~
                        |                                    ;
                  main.cpp:111:32: error: ‘newItem’ was not declared in this scope
                    111 |         selector_type::addItem(newItem, selector_type::getItem(i, k));
                        |                                ^~~~~~~
                  main.cpp:112:22: error: ‘newItem’ was not declared in this scope
                    112 |       product.insert(newItem);                          // добавить в результат
                        |                      ^~~~~~~
                  main.cpp: In instantiation of ‘auto doTest(const T&) [with T = std::vector<std::vector<int> >]’:
                  main.cpp:121:31:   required from here
                  main.cpp:108:26: error: dependent-name ‘decltype (product)::value_type’ is parsed as a non-type, but instantiation yields a type
                    108 |       decltype(product)::value_type newItem;            // чем добавлять все, кроме последнего
                        |                          ^~~~~~~~~~
                  main.cpp:108:26: note: say ‘typename decltype (product)::value_type’ if a type is meant
                  main.cpp: In instantiation of ‘auto doTest(const T&) [with T = std::vector<std::__cxx11::basic_string<char> >]’:
                  main.cpp:137:31:   required from here
                  main.cpp:108:26: error: dependent-name ‘decltype (product)::value_type’ is parsed as a non-type, but instantiation yields a type
                  main.cpp:108:26: note: say ‘typename decltype (product)::value_type’ if a type is meant

                :-?
                  Компилил в C++17, пропустил typename впереди.
                  Вообще, изначально было C++14, но понадобилось structure binding, чтобы избавиться от уродливого std::tie().
                    Цитата Majestio @
                    Дубль цифры "1"

                    Небольшой фикс
                    ExpandedWrap disabled
                      #include <iostream>
                      #include <vector>
                      #include <algorithm>
                      #include <string>
                      #include <unordered_set>
                       
                      int main()
                      {
                          const std::vector<std::string> arr = {"1.12.1", "2.4.15", "1.11.1", "33.4"};
                          std::vector<std::vector<int>> int_arr;
                          std::vector<std::vector<int>> int_out_arr;
                          std::vector<std::string> out_arr;
                          for (const std::string& s : arr)
                          {
                              std::vector<int> x;
                              size_t i = 0;
                              for ( ; ; )
                              {
                                  const size_t j = s.find('.', i);
                                  x.emplace_back(std::stoi(s.substr(i, j != std::string::npos ? (j - i) : j)));
                                  if (j == std::string::npos)
                                      break;
                                  i = j + 1;
                              }
                              int_arr.emplace_back(std::move(x));
                          }
                          std::sort(int_arr.begin(), int_arr.end());
                          for (size_t i = 0; i < int_arr.size(); ++i)
                          {
                              size_t j = 0;
                              if (i != 0)
                              {  
                                  const size_t min_len = std::min(int_arr[i].size(), int_arr[i - 1].size());
                                  for ( ; j < min_len; ++j)
                                      if (int_arr[i][j] != int_arr[i - 1][j])
                                          break;
                              }
                              for (++j; j <= int_arr[i].size(); ++j)
                                  int_out_arr.emplace_back(std::vector<int>(int_arr[i].begin(), int_arr[i].begin() + j));
                          }
                          std::sort(int_out_arr.begin(), int_out_arr.end(), [](const std::vector<int>&a, const std::vector<int>&b){
                              if (a.size() == b.size())
                                  return a < b;
                              return a.size() > b.size();
                          });
                          for (const std::vector<int>& line : int_out_arr)
                          {
                              std::string s;
                              for (int value : line)
                              {
                                  if (!s.empty())
                                      s += '.';
                                  s += std::to_string(value);
                              }
                              out_arr.emplace_back(std::move(s));
                          }
                          for (const std::string& s : out_arr)
                              std::cout << s << std::endl;
                          return 0;
                      }
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0368 ]   [ 16 queries used ]   [ Generated: 27.04.24, 12:43 GMT ]