2015-05-29 3 views
-1

У меня есть два вектора vector<unsigned>, а именно: vector<vector<unsigned> > sbp, vector<vector<unsigned> > sp. Я хочу напечатать все эти векторы в sbp, которые также находятся в sp. Оба вектора sbp и sp сохраняются (i) сначала по размеру; (ii), и когда размер равен, то векторы сортируются лексикографически. Для этого я написал следующий код. Кажется, что код дает ошибку сегментации. Я отлаживал код (путем печати значений), но я не могу найти источник ошибки.Нахождение векторов в C++

Может кто-то, пожалуйста, помогите мне найти то, что может быть источником ошибки сегментации. Кроме того, если есть какой-то алгоритм, который быстрее, чем это, то это будет действительно большой

#include <vector> 
#include <iostream> 
#include <algorithm> 
using namespace std; 
int main() 
{ 
    vector<vector<unsigned> > sbp; 
    vector<vector<unsigned> > sp; 
    vector<vector<unsigned> >::iterator itSP=sp.begin(); 
    for(vector<vector<unsigned> >::iterator itSbp=sbp.begin(),lSbp=sbp.end();itSbp!=lSbp;) 
    { 
     if(std::lexicographical_compare(((*itSbp)).begin(), ((*itSbp)).end(), (*itSP).begin(), (*itSP).end())) 
     { 
      itSbp++; 
     }else{ 
      if((*itSbp)==(*itSP)) 
      { 
       // cout<<(*itSbp)<<"\n"; 
       itSbp++; 
      }else{ 
       itSP++;     
      }    
     } 
    } 
} 

Я использую C++ 11 (GCC 4.8)

+0

@DavidSchwartz он установлен здесь lSbp = sbp.end() –

+0

ли, [что] (http://coliru.stacked-crooked.com/a/769e412f10ce39bb) даже компилировать? –

+0

@MarcoA. теперь он должен –

ответ

2

Я хочу, чтобы напечатать все эти векторы sbp, которые также находятся в sp.

Всякий раз, когда возникает ситуация, когда вы хотите сопоставить общие значения, которые находятся в двух контейнерах, алгоритм, который должен сразу возникнуть, - std::set_intersection.

Предостережение заключается в том, что для std::set_intersection контейнеры содержат отсортированные значения (или функтор, который описывает порядок сортировки). Однако, если вы можете соответствовать этим критериям, тогда решение тривиально.

Вот пример:

#include <vector> 
#include <iostream> 
#include <algorithm> 
#include <iterator> 

using namespace std; 

int main() 
{ 
    // test data 
    vector<vector<unsigned> > sbp = { { 1, 2, 3, 4, 6, 7 }, { 1, 2, 3, 6, 7 }, { 2, 3, 4, 6, 7 }}; 
    vector<vector<unsigned> > sp = { { 1, 2, 3, 4, 6, 7 }, { 1, 2, 3, 4, 6, 7, 8 }, { 2, 3, 4, 6, 7 }}; 

    // resulting vector 
    vector<vector<unsigned> > result; 

    // get the intersection of the two values 
    set_intersection(sbp.begin(), sbp.end(), sp.begin(), sp.end(), back_inserter(result)); 

    // output the results 
    for_each(result.begin(), result.end(), [](const std::vector<unsigned>& v) 
      {copy(v.begin(), v.end(), ostream_iterator<unsigned>(cout, " ")); cout << "\n";}); 
} 

Live Example

Если число деталей велико, и есть хорошая вероятность того, что данные содержат дубликаты, то std::set может быть использован для хранения данные.

// resulting vector 
    std::set<vector<unsigned>> result; 

    // get the intersection of the two values 
    set_intersection(sbp.begin(), sbp.end(), sp.begin(), sp.end(), std::inserter(result, result.begin())); 
Смежные вопросы