And one more... If you use C++11 then better to use emplace_back() instead of push_back()...From: Igor MironchikSent: Thursday, October 02, 2014 5:02 PMSubject: Re: [Boost-users] [Boost] [DateTime] dividing a time_period in Ntime_periodsHi.Try this:list< time_period > splitTimePeriod( time_period timePeriod, int n ){
const time_duration equalPeriod =( timePeriod.end() - timePeriod.begin() ) / n;list< time_period > timePeriods;// tiempo de comienzo del primer período de tiempoptime tpBegin = timePeriod.begin();// tiempo de fin del último período de tiempoconst ptime tpLastEnd = timePeriod.end();for( int i = 0; i < n; ++i ){// tiempo de fin del período de tiempoptime tpEnd;if( i == n - 1 )tpEnd = tpLastEnd;else{tpEnd = tpBegin + equalPeriod;// guarda para evitar que por cuestiones// de redondeo, el tiempo final de un período// sea mayor que el pasado inicialmente// como argumento de entradaif( tpEnd > tpLastEnd )tpEnd = tpLastEnd;}time_period p( tpBegin, tpEnd );// se inserta período de tiempo en la listatimePeriods.push_back( p );// se actualiza el comienzo del siguiente período de tiempotpBegin = tpEnd;}return timePeriods;}
It should be a little be more efficient.
And I think that this is excess:
// guarda para evitar que por cuestiones// de redondeo, el tiempo final de un período// sea mayor que el pasado inicialmente// como argumento de entradaif( tpEnd > tpLastEnd )tpEnd = tpLastEnd;From: Pablo MadoerySent: Thursday, October 02, 2014 4:38 PMSubject: Re: [Boost-users] [Boost] [DateTime] dividing a time_period in Ntime_periodsI have changed the method to this:list<time_period> splitTimePeriod(time_period timePeriod, int n){time_duration equalPeriod = (timePeriod.end() - timePeriod.begin()) / n;list<time_period> timePeriods;// tiempo de comienzo del primer período de tiempoptime tpBegin = timePeriod.begin();// tiempo de fin del último período de tiempoptime tpLastEnd = timePeriod.end();for (int i = 0; i < n; i++){// tiempo de comienzo del siguiente período de tiempoptime tpNextBegin = tpBegin + equalPeriod;// tiempo de fin del período de tiempoptime tpEnd;if (i == n - 1){tpEnd = tpLastEnd;}else{tpEnd = dateTime::decrement(tpNextBegin, 1);// guarda para evitar que por cuestiones// de redondeo, el tiempo final de un período// sea mayor que el pasado inicialmente// como argumento de entradaif (tpEnd > tpLastEnd){tpEnd = tpLastEnd;}}time_period p(tpBegin, tpEnd);// se inserta período de tiempo en la listatimePeriods.push_back(p);// se actualiza el comienzo del siguiente período de tiempotpBegin = tpNextBegin;}return timePeriods;}############################################################I didn't know I can make these operations to time_duration:time_duration equalPeriod = (timePeriod.end() - timePeriod.begin()) / n;Now it works faster.On Thu, Oct 2, 2014 at 10:21 AM, Pablo Madoery <madoerypablo@gmail.com> wrote:
I think the time_duration s will be equal, but the time_periods will be something like this:2014-Jan-01 00:00:00 -> 2014-Jan-01 00:00:02.9999992014-Jan-01 00:00:03 -> 2014-Jan-01 00:00:05.9999992014-Jan-01 00:00:06 -> 2014-Jan-01 00:00:08.9999992014-Jan-01 00:00:09 -> 2014-Jan-01 00:00:11.9999992014-Jan-01 00:00:12 -> 2014-Jan-01 00:00:14.9999992014-Jan-01 00:00:15 -> 2014-Jan-01 00:00:17.9999992014-Jan-01 00:00:18 -> 2014-Jan-01 00:00:21when calling the method like thisptime p1 = dateTime::toPtime("2014-1-1 00:00:00");ptime p2 = dateTime::toPtime("2014-1-1 00:00:21");time_period tp(p1,p2);list<time_period> l = dateTime::splitTimePeriod(tp, 7);list<time_period>::iterator i = l.begin();for(; i!= l.end(); ++i){cout<<i->begin()<<" -> "<<i->end()<<endl;}On Thu, Oct 2, 2014 at 10:13 AM, Leon Mlakar <leon@digiverse.si> wrote:_______________________________________________If you are splitting a time period into N periods of equal duration, wouldn't it be enough to return just one time period? The other n-1 are going to be equal, except perhaps for the last.On 02/10/14 15:09, Pablo Madoery wrote:Hi, I want to make a method which divides a time_period in N time periods,something like this:list<time_period> splitTimePeriod(time_period timePeriod, int n);I actually have made it and although it seems to work it results very inefficient regarding the time it took to divide a large time_period.The method I did is this:list<time_period> splitTimePeriod(time_period timePeriod, int n){double secsTime = dateTime::diffSeconds(timePeriod.end(), timePeriod.begin());// tiempo en segundos de cada período de tiempodouble ti = secsTime / n;list<time_period> timePeriods;// tiempo de comienzo del primer período de tiempoptime tpBegin = timePeriod.begin();// tiempo de fin del último período de tiempoptime tpLastEnd = timePeriod.end();for (int i = 0; i < n; i++){int tUnits = ti * time_duration::ticks_per_second();// tiempo de comienzo del siguiente período de tiempoptime tpNextBegin = dateTime::increment(tpBegin, tUnits);// tiempo de fin del período de tiempoptime tpEnd;if (i == n - 1){tpEnd = tpLastEnd;}else{tpEnd = dateTime::decrement(tpNextBegin, 1);// guarda para evitar que por cuestiones// de redondeo, el tiempo final de un período// sea mayor que el pasado inicialmente// como argumento de entradaif (tpEnd > tpLastEnd){tpEnd = tpLastEnd;}}time_period p(tpBegin, tpEnd);// se inserta período de tiempo en la listatimePeriods.push_back(p);// se actualiza el comienzo del siguiente período de tiempotpBegin = tpNextBegin;}return timePeriods;}Other methods I use are these:double diffSeconds(const ptime &dateA, const ptime &dateB){time_duration diff = dateA - dateB;return diff.total_seconds();}ptime increment(const ptime &date, int n){time_iterator it(date, dateTime::unit);for (int i = 0; i < n; i++){++it;}return *it;}ptime decrement(const ptime &date, int n){time_iterator it(date, dateTime::unit);for (int i = 0; i < n; i++){--it;}return *it;}const time_duration unit = microseconds(1);#################################################The question is: is there a better way to accomplish this?
Leon
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users
_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users
_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users