Saturday, November 5, 2016

partition_copy has front back container

partition got a itr point to the begin of back partition, but it is not incrementable.
partition_copy allows pass in two containers through back/front_insert so can increment.
Note that vector is random iter but cannot use front_insert, why?
Note Stable Partition keep tag1 partition "Stabilize" and then partition by tag2 the back container


#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <iterator>
#include <list>

using namespace std;

enum  attrib
{
 a0,a1, a2, a3, a4, a5, a6, a7, a8, a9,
 tag1 = a4,
 tag2 = a7
};

struct Entity
{
 attrib EntityAttrib;
};


int main()
{
 vector<Entity> v = { {a7},{ a1 }, { a5 }, { a9 }, { a4 }, { a6 }, { a8 }, { a2 }, { a3 }, {a0} };

 auto parti_tag1_itr=partition(v.begin(), v.end(), [](const Entity& e) {return e.EntityAttrib < tag1; });
 int c_front = count_if(v.begin(), v.end(), [](const Entity& e) {return e.EntityAttrib < tag1; });

 for(int i=0;i<c_front;i++)
     cout << (*(--parti_tag1_itr)).EntityAttrib << endl;
 cout << endl;

 vector<Entity> front_parti(10);
 list<Entity> back_parti(10);
 partition_copy(v.begin(), v.end(), back_inserter(front_parti), front_inserter(back_parti), [](const Entity& e) {return e.EntityAttrib > tag1; });

 for (auto e : front_parti)
 {
  cout << e.EntityAttrib << endl;
 }

 std::string s;
 getline(cin, s);
    return 0;
} 

stable_partition(back_parti.begin(), back_parti.end(), [](const Entity& e) {return e.EntityAttrib < tag2; });

No comments:

Post a Comment