my problem is identical to the topic below, I'm struggling to figure out the answers, or rather, my code should not work, as it only uses input iterators. but my function seems to work and behaves the same way with std :: search..so I'm at a loss and hate to move on without understanding properly ... maybe if someone can suggest an input that breaks my function, but not std ::
From Why do I need an Iterator to implement my customized std :: search :
I am learning the book Accelerated C ++ by Koenig and Moo.
Exercise 8-2 ask me to implement on my own some of the template functions of & L; algorithm> and <number>, and to indicate which iterator does my required implementation.
When trying to implement std :: search, I decided that I needed only "enter" iterators.
However, looking at the implementation of std :: search installed with my compiler, I see that they use “forward” iterators, but I can’t understand why, because there is no need to write, only read and enter iterators meet the requirements.
Can someone here help me figure this out, please? Why do I need to use "forward" iterators to implement stand :: search?
Thanks in advance.
MyFunction:
template <class In>
In search( In begin, In end, In begin2, In end2 )
{
In found ; // iter: 1st element in pattern match(in content)
In pattern_begin = begin2 ; // iter: 1st element in search pattern.
int flag = 0 ; // flag: partial match found?
// search content for pattern
while ( begin < end ) {
// if pattern-match fails ..reset vars
// & continue searching remaining content/elements
if ( *begin != *begin2 ) {
In ret ;
begin2 = pattern_begin ;
flag = 0 ;
begin++ ;
} else {
// compare next element in pattern with next element in content.
// if: 1st element of 'pattern' is found, store iter to it pos
// ..then if entire pattern is found, we can ret an iter to where it starts
if ( flag == 0 ) {
found = begin ;
flag = 1 ;
}
// inc iters to compare next elements in partial match
begin++ ;
begin2++ ;
}
// if: iter is 1-past end of search pattern
// then entire pattern has been found
// return the iter to where it starts
if( begin2 == end2 ) { return found ; }
}
// end of content reached, no complete pattern found
// begin should? equal an iter 1-past the end of content
return begin ;
}
driver:
#include <string>
#include <vector>
#include <iostream>
#include "library_algorithms.h"
int main() {
std::string content = "fo The fox foxu jumped foxe foxy " ;
std::string search_pattern = "foxy" ;
std::string::iterator ret_iter =
custom::search( content.begin(), content.end(), search_pattern.begin(), search_pattern.end() ) ;
if ( ret_iter != content.end() ) {
std::cout << std::endl << std::endl << search_pattern << ": found at position: " << int( ret_iter - content.begin() ) << std::endl;
} else {
std::cout << std::endl << std::endl << search_pattern << ": ...not found" << std::endl;
}
std::vector<int> myvector;
for (int i=1; i<1000; i++) myvector.push_back(i*10);
std::vector<int> pattern ;
pattern.push_back( 3730 ) ;
pattern.push_back( 3740 ) ;
pattern.push_back( 3750 ) ;
pattern.push_back( 3760 ) ;
std::vector<int>::iterator it;
it = custom::search ( myvector.begin(), myvector.end(), pattern.begin(), pattern.end() );
if (it!=myvector.end())
std::cout << std::endl << std::endl << "pattern found at position " << int(it-myvector.begin()) << std::endl;
else
std::cout << std::endl << std::endl << "pattern not found" << std::endl;
return 0 ;
}