2014-10-14 3 views
1

Я хотел написать программу, которая сравнивает vectora с vectorb. И если vectora является дополнительным вектором vectorb, то возврат true еще false. Например:Как сравнить векторы простым и эффективным способом?

vector a is 1,2,3 

и vector b is 2,3,4,1,1,2,3,56.
Таким образом, он должен находиться в смежном блоке. И я написал этот неприятный код, но я хочу это коротко написать. Я не хочу объявлять глобальные переменные для этой проблемы.

bool i_vec(vector<int>& a, vector<int> b) 
    { 
     vector<int> index (b.size(),0); 
     int counter = 0; 

     // if (a.size() <= b.size()) { 

      for (int i = 0; i < a.size(); i++) { 
       for (int j = 0; j < b.size(); j++) { 
        if (a[i]== b[j]) { 
         index[j] = 1; 
        } 
       } 
      } 

      for (int i = 0; i < index.size(); i++) { 
       if (index[i] == 1) { 
        for (int j = i; j < index.size(); j++) { 
         if (index[j] == 1) { 
          counter++; 
         } 
        } 
        if(counter == a.size()){ 
         //cout<<"true"<<endl; 

         return true; 
         break; 
        } 
        else{ 
         counter = 0; 
         cout<<"false"<<endl; 
         return false; 
         // continue; 
        } 

       } 
      } 
     // } 
     return 0; 
    } 
+6

'вернуться зЬй :: поиск (b.begin(), b.end(), a.begin(), a.end()) = b.end (!),' Короткий путь, и нет глобальных переменных. –

+0

@IgorTandetnik Должна ли эта линия быть достаточной? – user4032883

+1

Если вы хотите изучить эффективные реализации этого, вы можете прочитать: http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm – Laserallan

ответ

0

Почему бы не использовать алгоритм stl.Это эффективно, а также делает выборку предметов.

bool i_vec(const vector<int>& a, const vector<int>& b) 
{ 
    for(vector<int>::size_type i = 0; i <= b.size() - a.size(); i++) 
    { 
     if(equal(a.begin(), a.end(), &b[i])) 
     { 
      return true; 
     } 
    } 
    return false; 
} 
+0

Почему бы не использовать 'std :: search' вместо всего этого цикла' for' и 'std :: equal'? – Blastfurnace

+0

@ Blastfurnace. Вы правы. Это лучшее решение. – wuqiang

+0

@Blastfurnace Итак, это итеративное решение? – user4032883

Смежные вопросы