难道是c++中的find_end()有BUG?

软件和网站开发以及相关技术探讨
回复
iamcook84
帖子: 41
注册时间: 2013-08-29 9:27

难道是c++中的find_end()有BUG?

#1

帖子 iamcook84 » 2014-05-08 12:19

//以下是wrong.cpp。那里出问题了?难道是c++中的find_end()有BUG?


#include <vector>
#include <algorithm>
#include <iostream>
bool equals ( int elem1, int elem2 )
{
return 2 * elem1 == elem2;
}
int main(int argc,char *argv[] )
{
using namespace std;
vector <int> v1, v2;
vector <int>::iterator Iter1, Iter2;
int i;
for ( i = 0 ; i <= 5 ; i++ )
{
v2.push_back( 5 * i );
}
int iii;
for ( iii = 0 ; iii <= 11 ; iii++ )
{
v1.push_back(iii);
}

cout << "Vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
cout << "Vector v2 = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")" << endl;

vector <int>::iterator result;
result = find_end ( v1.begin( ), v1.end( ), v2.begin( ), v2.end( ), equals );;


if ( result == v1.end( ) )
cout << "There is no match of v2 in v1."
<< endl;
else
cout << "There is a sequence of elements in v1 that "
<< "are equivalent to those\n in v2 under the binary "
<< "predicate twice and that begins at position "
<< result - v1.begin( ) << "." <<endl;
}
/*
suse@linux-qmfx:~/program> g++ -o wrong up.cpp
suse@linux-qmfx:~/program> ./wrong
Vector v1 = ( 0 1 2 3 4 5 6 7 8 9 10 11 )
Vector v2 = ( 0 5 10 15 20 25 )
There is no match of v2 in v1.
suse@linux-qmfx:~/program>
#v1 中的 10 、5为什么找不出来?
*/
头像
huangbster
帖子: 187
注册时间: 2012-10-29 11:35
系统: UBUNTU

Re: 难道是c++中的find_end()有BUG?

#2

帖子 huangbster » 2014-05-08 12:59

你没有理解find_end的功能。

代码: 全选

template<class ForwardIterator1, class ForwardIterator2>
  ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1,
                             ForwardIterator2 first2, ForwardIterator2 last2)
{
  if (first2==last2) return last1;  // specified in C++11

  ForwardIterator1 ret = last1;

  while (first1!=last1)
  {
    ForwardIterator1 it1 = first1;
    ForwardIterator2 it2 = first2;
    while (*it1==*it2) {    // or: while (pred(*it1,*it2)) for version (2)
        ++it1; ++it2;
        if (it2==last2) { ret=first1; break; }
        if (it1==last1) return ret;
    }
    ++first1;
  }
  return ret;
}
回复