Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.138.141.202] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
ты спецом так раздул код? Добавлено Цитата Qraizer @ Кстати, Majestio, где тест с мульёном вложений подразделов? А то 3 как-то несерьёзно. Не не не ... я не пишу универсальную хрень - чисто разовый утиль. Написал-использовал-забыл. |
Сообщ.
#17
,
|
|
|
P.S. Выглядит громоздко. Зато тут полноценное обобщённое решение. Для любого другого представления просто доопределяем политику struct blah_blah_blah_Accessor и однострочно специализируем Selector<>. М-м-м... doTest() должен справиться и без настройки, ему лишь бы контейнер какой-нить с begin()/end() дали. Наверное...
Добавлено Собственно решение на ~100 строк, и оно, поверь, даже в таком виде быстрее за счёт отсутствия тяжёлых в ран-тайме сущностей. При этом это два решения сразу. Остальные строки только запускают этот код на разных примерах |
Сообщ.
#18
,
|
|
|
Цитата Qraizer @ Зато тут полноценное обобщённое решение. Ну если только для академических целей ... |
Сообщ.
#19
,
|
|
|
Цитата Majestio @ Ну и зря. Тут вся сложность в алгоритме компаратора. Sorter<>::operator() который. Написать его совсем не сложно. Меня заинтересовало именно обобщённое решение для различных представлений. Не не не ... я не пишу универсальную хрень - чисто разовый утиль. Написал-использовал-забыл. Добавлено Потратил я, кстати, часа два. Сегодня после обеда решил передохнуть от дидлайна. Счас комментов только накидал. |
Сообщ.
#20
,
|
|
|
Цитата Qraizer @ Ну и зря. Тут вся сложность в алгоритме компаратора. Ну что тут сказать ... я рад, что и ты тут нашел себе развлечение |
Сообщ.
#21
,
|
|
|
На вот для примера.
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; // стратегия для недо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<>>? |
Сообщ.
#22
,
|
|
|
Попробовал откомпилячить в С++20 - выдает ошибки Штото типа: 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 |
Сообщ.
#23
,
|
|
|
Компилил в C++17, пропустил typename впереди.
Вообще, изначально было C++14, но понадобилось structure binding, чтобы избавиться от уродливого std::tie(). |
Сообщ.
#24
,
|
|
|
Небольшой фикс #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; } |