2015-02-25 3 views
-1

У меня есть два вектора полных структур, которые очень просто:C++: Как использовать set_intersection для двух векторов, содержащих пользовательские структуры?

typedef struct{ 
    //three vertex ids 
    uint a,b,c; 

} Face; 

Я в настоящее время пытается запустить set_intersection так:

set_intersection(listOfFaces1.begin(),listOfFaces1.end(),listOfFaces2.begin(),listOfFaces2.end(), back_inserter(facesToDelete)); 

Я предполагаю, что мне нужно, чтобы перезаписать некоторые компаратор как-то ? Но я не уверен, как определить определение между двумя объектами Face ...

Любая помощь будет очень признательна.

+2

Посмотрите [этот вопрос] (http://stackoverflow.com/questions/6955578/subtraction-and-intersection-of- two-vectors-of-pointers-in-c) – Joel

+0

Вам нужно (a) определить 'operator <' для класса или (b) определить функтор/функцию, которая может сравнивать два 'Face'. Если вы используете (b), вы передаете функтор/функцию в качестве последнего аргумента. –

+0

@RSahu Я знаю о передаче функции в качестве последнего аргумента, но примеры, которые я нашел онлайн, просто определяют, когда один объект <другой, а не ==. И в этом случае нет никакого способа определить, какой объект Face <другой. Я только хочу проверить равенство, но, похоже, нет способа сделать это с помощью функции сравнения, которую я могу передать в set_intersection()? – user2976199

ответ

0

Прежде всего, когда вы программируете на C++, вы можете просто использовать:

struct Face { 
    uint a,b,c; 
}; 

Вот простая стратегия для реализации operator<, которая работает для алгоритмов и контейнеров в стандартной библиотеке.

struct Face { 
    uint a,b,c; 

    bool operator<(Face const& rhs) const 
    { 
     if (a != rhs.a) 
     { 
      return (a < rhs.a); 
     } 
     if (b != rhs.b) 
     { 
      return (b < rhs.b); 
     } 
     return (c < rhs.c); 
    } 
}; 

или, как это было предложено @Praetorian,

struct Face { 
    uint a,b,c; 

    bool operator<(Face const& rhs) const 
    { 
     return std::tie(a, b, c) < std::tie(rhs.a, rhs.b, rhs.c); 
    } 
}; 
+0

Я получаю эту ошибку: ошибка C2805: двоичный 'оператор <' имеет слишком мало параметров – user2976199

+0

Также получение этой ошибки: ошибка C2061: синтаксическая ошибка: идентификатор 'Face' – user2976199

+0

Хорошо, никогда не забывайте сдвигать «Лицо» на фронт. Оставил его в конце. Благодаря! – user2976199