模式匹配 编译器 是不是有问题?
#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; }
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