fork download
  1. #include <vector>
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <memory>
  5.  
  6. class AbstractBase
  7. {
  8. protected:
  9. int ident;
  10. public:
  11. AbstractBase(int id) : ident(id) {}
  12.  
  13. virtual ~AbstractBase() {}
  14. virtual std::unique_ptr<AbstractBase> clone() const = 0;
  15. virtual void add() = 0;
  16.  
  17. int getIdent()const {return ident;}
  18. };
  19.  
  20. class Derived1 : public AbstractBase
  21. {
  22. public:
  23. Derived1(int i) : AbstractBase(i) {}
  24. void add() override { ident += 1; }
  25. std::unique_ptr<AbstractBase> clone() const override
  26. {
  27. return std::make_unique<Derived1>(*this);
  28. }
  29. };
  30.  
  31. class Derived2 : public AbstractBase
  32. {
  33. public:
  34. Derived2(int i) : AbstractBase(i) {}
  35. void add() override { ident+=2; }
  36. std::unique_ptr<AbstractBase> clone() const override
  37. {
  38. return std::make_unique<Derived2>(*this);
  39. }
  40. };
  41.  
  42. class cloneFunctor
  43. {
  44. public:
  45. std::unique_ptr<AbstractBase> operator() (const AbstractBase* a) const
  46. {
  47. return a->clone();
  48. }
  49. };
  50.  
  51. struct IdentCompare
  52. {
  53. bool operator()(const AbstractBase* f) const
  54. {
  55. return f->getIdent() > 5;
  56. }
  57. };
  58.  
  59. void WorkWithClonedVector(const std::vector<AbstractBase*>& origList, std::vector<AbstractBase*>::const_iterator it)
  60. {
  61. std::vector<std::unique_ptr<AbstractBase>> tempList;
  62. std::transform(origList.begin(),origList.end(),back_inserter(tempList),cloneFunctor());
  63. auto tempIt = std::next(tempList.begin(), std::distance(origList.begin(), it));
  64. (*tempIt)->add();
  65. std::cout << "local list:\n";
  66. int i = 1;
  67. for(const auto& cloned : tempList)
  68. {
  69. std::cout << "Element " << i << ": " << cloned->getIdent() << '\n';
  70. ++i;
  71. }
  72. std::cout << "Original Iterator still pointing to: " << (*it)->getIdent() << '\n';
  73. }
  74.  
  75.  
  76. int main()
  77. {
  78. Derived1 d1(1);
  79. Derived1 d1b(2);
  80. Derived2 d2(7);
  81. Derived2 d2b(5);
  82. std::vector<AbstractBase*> List = {&d1, &d1b, &d2, &d2b};
  83. auto iter = std::find_if(List.begin(), List.end(), IdentCompare());
  84. WorkWithClonedVector(List, iter);
  85. std::cout << "Original List not changed:\n";
  86. int i = 1;
  87. for(const auto& derived : List)
  88. {
  89. std::cout << "Element " << i << ": " << derived->getIdent() << '\n';
  90. }
  91. }
  92.  
Success #stdin #stdout 0s 16064KB
stdin
Standard input is empty
stdout
local list:
Element 1: 1
Element 2: 2
Element 3: 9
Element 4: 5
Original Iterator still pointing to: 7
Original List not changed:
Element 1: 1
Element 1: 2
Element 1: 7
Element 1: 5