filter-bubble.cpp (1394B)
1 #include <vector> 2 #include <string> 3 #include <memory> 4 #include <print> 5 #include <generator> 6 #include <algorithm> 7 8 template <typename T> 9 std::generator<T&> filter_bubble(std::vector<std::weak_ptr<T>>& vec) 10 { 11 auto removed = vec.end(); 12 auto it = vec.begin(); 13 14 while (removed != it && it->expired()) 15 std::iter_swap(it, --removed); 16 17 if (it != removed) 18 { 19 auto next = std::next(it); 20 21 while (next != removed) 22 { 23 if (next->expired()) 24 { 25 std::iter_swap(next, --removed); 26 continue; 27 } 28 if (next->owner_before(*it)) 29 std::iter_swap(it, next); 30 co_yield *it->lock(); 31 it = next++; 32 } 33 34 co_yield *it->lock(); 35 } 36 37 vec.erase(removed, vec.end()); 38 co_return; 39 } 40 41 int main(int argv, char* argc[]) 42 { 43 std::vector<std::shared_ptr<std::string>> strings; 44 for (int i = 0; i < argv; ++i) 45 strings.push_back(std::make_shared<std::string>(argc[i])); 46 47 std::vector<std::weak_ptr<std::string>> string_refs; 48 std::ranges::copy(strings, std::back_inserter(string_refs)); 49 50 std::random_shuffle(string_refs.begin(), string_refs.end()); 51 52 for(unsigned i = 1;;++i) 53 { 54 std::print("round {} (", i); 55 for (auto& x : filter_bubble(string_refs)) 56 std::print(" {}", x); 57 std::println(" ) {}", std::ranges::is_sorted(string_refs, std::owner_less<decltype(string_refs)::value_type>{})); 58 if (strings.empty()) 59 break; 60 strings.erase(strings.begin() + std::rand() % strings.size()); 61 } 62 }