fork(1) download
  1. #include <iostream>
  2. #include <algorithm> //For std::swap
  3. #include <memory> //For std::unique_ptr
  4. #include <vector>
  5.  
  6. //std::make_unique implementation (it was forgotten in the C++11 standard, and will be added later).
  7. //Once it's added, I can just remove this from here.
  8. template<typename T, typename ...Args>
  9. std::unique_ptr<T> make_unique( Args&& ...args )
  10. {
  11. return std::unique_ptr<T>( new T( std::forward<Args>(args)... ) );
  12. }
  13.  
  14. //Swaps and pops every element in 'container', for which the callback function 'predicate(element)' returns false.
  15. //This is faster than std::remove_if(), but does not preserve the order of the elements like 'remove_if()' does.
  16. template<typename ContainerType, typename FunctionType>
  17. void SwapAndPop(ContainerType &container, FunctionType predicate)
  18. {
  19. for(typename ContainerType::iterator it = container.begin(); it != container.end();)
  20. {
  21. if(predicate(*it))
  22. {
  23. //Swap the value of the current element with the element at the back of the container.
  24. std::swap(*it, container.back());
  25. //Pop the back of the container.
  26. container.pop_back();
  27.  
  28. if(container.empty())
  29. {
  30. break;
  31. }
  32. }
  33. else
  34. {
  35. ++it;
  36. }
  37. }
  38. }
  39.  
  40. class Object
  41. {
  42. static unsigned nextID;
  43.  
  44. public:
  45. Object() : timeToDelete(++nextID % 3), id(nextID) { }
  46.  
  47. bool timeToDelete = false;
  48. size_t id = 0;
  49.  
  50. public:
  51. typedef std::unique_ptr<Object> uPtr;
  52. };
  53.  
  54. unsigned Object::nextID = 0;
  55.  
  56. int main()
  57. {
  58. const size_t NumObjectsForTest = 40;
  59.  
  60. std::vector<Object::uPtr> objects;
  61.  
  62. //Create all the objects.
  63. for(size_t i = 0; i < NumObjectsForTest; ++i)
  64. {
  65. objects.push_back(make_unique<Object>());
  66. }
  67.  
  68. //Print all the objects.
  69. for(const auto &object : objects)
  70. {
  71. std::cout << "Object " << object->id << ": " << (object->timeToDelete? "[Time to delete]":"[Still alive]") << std::endl;
  72. }
  73.  
  74. std::cout << "------------------------------------\n"
  75. << "Calling SwapAndPop...\n"
  76. << "------------------------------------\n";
  77.  
  78. SwapAndPop(objects, [](Object::uPtr &objectPtr) -> bool { return objectPtr->timeToDelete; });
  79.  
  80. //Print all the objects again.
  81. for(const auto &object : objects)
  82. {
  83. std::cout << "Object " << object->id << ": " << (object->timeToDelete? "[Time to delete]":"[Still alive]") << std::endl;
  84. }
  85.  
  86. return 0;
  87. }
Success #stdin #stdout 0s 3432KB
stdin
Standard input is empty
stdout
Object 1: [Time to delete]
Object 2: [Time to delete]
Object 3: [Still alive]
Object 4: [Time to delete]
Object 5: [Time to delete]
Object 6: [Still alive]
Object 7: [Time to delete]
Object 8: [Time to delete]
Object 9: [Still alive]
Object 10: [Time to delete]
Object 11: [Time to delete]
Object 12: [Still alive]
Object 13: [Time to delete]
Object 14: [Time to delete]
Object 15: [Still alive]
Object 16: [Time to delete]
Object 17: [Time to delete]
Object 18: [Still alive]
Object 19: [Time to delete]
Object 20: [Time to delete]
Object 21: [Still alive]
Object 22: [Time to delete]
Object 23: [Time to delete]
Object 24: [Still alive]
Object 25: [Time to delete]
Object 26: [Time to delete]
Object 27: [Still alive]
Object 28: [Time to delete]
Object 29: [Time to delete]
Object 30: [Still alive]
Object 31: [Time to delete]
Object 32: [Time to delete]
Object 33: [Still alive]
Object 34: [Time to delete]
Object 35: [Time to delete]
Object 36: [Still alive]
Object 37: [Time to delete]
Object 38: [Time to delete]
Object 39: [Still alive]
Object 40: [Time to delete]
------------------------------------
Calling SwapAndPop...
------------------------------------
Object 39: [Still alive]
Object 36: [Still alive]
Object 3: [Still alive]
Object 33: [Still alive]
Object 30: [Still alive]
Object 6: [Still alive]
Object 27: [Still alive]
Object 24: [Still alive]
Object 9: [Still alive]
Object 21: [Still alive]
Object 18: [Still alive]
Object 12: [Still alive]
Object 15: [Still alive]