Debuggin a Simple STL Algorithm :: STL

Started by
3 comments, last by kuphryn 21 years, 5 months ago
Hi. I would like to debug a simple algorithm that does not work using an STL solution. The solution works via iteration. std::list theList; for (unsigned int i = 0; i < 10; ++i) theList.push_back(i); // theList should now contain 0, 1, 2, 3, 4, 5, 6, 7, 8, and 9. // Remove "6" from the list. // Assume that iTheList is an iterator that points to element with value 6. theList.erase(iTheList); // After erase() theList should now contain 0, 1, 2, 3, 4, 5, 7, 8, and 9. Okay. Everything above works as designed. Now I would like to decrement everything bigger or equal to "6," thus make theList hold 0, 1, 2, 3, 4, 5, 6, 7, 8, and 9. Here is the iterative solution. ----- // Given iTheList points to theList.begin(). while (*iTheList <= 6) ++iTheList // Now decrement until end of theList. while (*iTheList != theList.end() { *iTheList = *iTheList - 1; ++iTheList; } ----- The iterative solution above works perfect. I would like to implement a more efficient and elegant solution. Here is one solution using STL algorithms. However, it does not work correctly. ----- std::for_each(std::find_if(theList.begin(), theList.end(), std::bind2nd(std::greater<>, 6)), theList.end(), std::bind2nd(std::minus<>, 1)); ----- The STL solution above does not work. The logic and syntec seem to be valid. Is there a logic or syntec misunderstanding in the STL solution? I looked over the function objects and function adapter. They are valid. Thanks, KUphryn
Advertisement
for_each never assigns the result of the operation back, it just calls the function.
You are just doing value - 1, not value = value - 1.
That's the job of transform.


itor = theList.erase( std::find( theList.begin(), theList.end(), 6 ) );
std::transform( itor, theList.end(), itor, std::bind2nd( std::minus<int>(), 1 ) );


Documents [ GDNet | MSDN | STL | OpenGL | Formats | RTFM | Asking Smart Questions ]
C++ Stuff [ MinGW | Loki | SDL | Boost. | STLport | FLTK | ACCU Recommended Books ]


[edited by - Fruny on October 25, 2002 4:01:04 AM]
"Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it." — Brian W. Kernighan
Nice!!! Thanks.

I will test your solution by tomorrow.

Kuphryn
Okay. I added a class object that will do the minus manually.


  template <typename T>class DecreaseOne : public std::binary_function<T, T, void>{   public:      void operator()(T &lp, const T &rp)      {         lp -= rp;      }};  


Here the call to it.


  std::for_each(std::find_if(theList.begin(), theList.end(), std::bind2nd(std::greater<size_t>(), 6)), theList.end(), std::bind2nd(DecreaseOne<size_t>(), 1));  


The compiler will not compile. Here is the errors.


  error C2064: term does not evaluate to a functionerror C2662: 'DecreaseOne<unsigned int>::operator`()'' : cannot convert 'this' pointer from 'const DecreaseOne<T>' to 'DecreaseOne<T> &'        with        [            T=size_t        ]        and        [            T=size_t        ]  


I defined DecreaseOne functor as a global class.

What is the problem?

Thanks,
Kuphryn

[edited by - kuphryn on October 25, 2002 12:27:44 PM]
Fruny: Okay. Your algorithm works perfect.

Thanks again,
Kuphryn

This topic is closed to new replies.

Advertisement