读书人

模式匹配 编译器 是不是有有关问题

发布时间: 2012-03-23 12:06:21 作者: rapoo

模式匹配 编译器 是不是有问题?

C/C++ code
#include <vector>#include <iterator>#include <iostream>#include <algorithm>using std::distance;using std::cout;using std::endl;using std::vector;using std::iterator_traits;template<typename BidirectionalIterator>vector<int>* compute_prefix_function(BidirectionalIterator first, BidirectionalIterator last){      typedef typename   iterator_traits<BidirectionalIterator>::difference_type  difference_type;  difference_type  d =  distance(first, last);  vector<int>* V = new vector<int>((size_t)d, 0);  vector<int> k(1, -1) ;  int p = 0;  for( ; first != last ; ++first)  {          ++p;      while( k[0] > 0 && *(first + k[0] + 1) !=  *(first + p) )          k[0] = V[k[0]];           if( *(first + k[0] + 1) == *(first + p) )        ++k[0];    V[p] = k[0];  }        return V;}template<class BidirectionalIterator>void KMP_Matcher(BidirectionalIterator first1, BidirectionalIterator last1,               BidirectionalIterator first2, BidirectionalIterator last2){        typedef typename    iterator_traits<BidirectionalIterator>::difference_type difference_type;    difference_type d2 = distance(first2, last2);    vector<int>* V = compute_prefix_function(first2, last2);    vector<int> q(1, 0);    for( ; first1 != last1 ; ++first1)    {                while( q[0] > 0 && *(first2 + q[0]) != *first1 )              q[0] = V[q[0]];                  if( *(first2 + q[0]) == *first1)            q[0] = q[0] + 1;        if( q[0] == d2)        {            cout<<" Pattern occurs with shift  " <<*(first1 - q[0])<<endl;            q[0] = V[q[0]];        }    }     delete V;}int main(){    char A[] = "shhshshhsabc";    char B[] = "abc";    KMP_Matcher(A, A + sizeof(A)/sizeof(A[0]), B, B + sizeof(B)/sizeof(B[0]));    return 0;    }


编译器提示:
Deleting intermediate files and output files for project 'KMP_STL - Debug'
--------------------Configuration: KMP_STL - Debug--------------------
Compiling source file(s)...
KMP.cpp
KMP.cpp: In function `std::vector<int, std::allocator<int> >*
compute_prefix_function(BidirectionalIterator, BidirectionalIterator) [with
BidirectionalIterator = char*]':
KMP.cpp:41: instantiated from `void KMP_Matcher(BidirectionalIterator, BidirectionalIterator, BidirectionalIterator, BidirectionalIterator) [with BidirectionalIterator = char*]'
KMP.cpp:64: instantiated from here
KMP.cpp:25: error: cannot convert `std::vector<int, std::allocator<int> >' to `
int' in assignment
KMP.cpp:41: instantiated from `void KMP_Matcher(BidirectionalIterator, BidirectionalIterator, BidirectionalIterator, BidirectionalIterator) [with BidirectionalIterator = char*]'
KMP.cpp:64: instantiated from here
KMP.cpp:29: error: no match for 'operator=' in '*(V + (+(p * 12))) =
(&k)->std::vector<_Tp, _Alloc>::operator[](unsigned int) [with _Tp = int,
_Alloc = std::allocator<int>](0)'
D:\MinGWStudio\MinGW\include\c++\3.3.1\bits\vector.tcc:128: error: candidates
are: std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(const
std::vector<_Tp, _Alloc>&) [with _Tp = int, _Alloc = std::allocator<int>]
KMP.cpp: In function `void KMP_Matcher(BidirectionalIterator,
BidirectionalIterator, BidirectionalIterator, BidirectionalIterator) [with
BidirectionalIterator = char*]':
KMP.cpp:64: instantiated from here
KMP.cpp:47: error: cannot convert `std::vector<int, std::allocator<int> >' to `
int' in assignment
KMP.cpp:64: instantiated from here
KMP.cpp:54: error: cannot convert `std::vector<int, std::allocator<int> >' to `
int' in assignment



KMP_STL.exe - 11 error(s), 0 warning(s)
我觉得类型是匹配的。比如:
vector<int>t(1);
vector<int>m(1);
t[0] 是int
那么:m[t[0]]就是对的。
是不是编译器的问题?



[解决办法]
V[p] = k[0];
至少这句是错误的
V是vector<int>*
V[0]是一个vector<int>对象
k[0]是一个int
这两者不能assign

读书人网 >C++

热点推荐