2013-09-04 2 views
2

У меня есть класс с «массивом из массива» частный член представлены в виде:C++ станд :: копия станда :: Deque к StD:; установить

std::deque<std::deque<SomeClass> > someArray_; 

Кроме того, этот класс общедоступного метода, который позволяет получить все уникальные экземпляры SomeClass, содержащие в someArray_. Уникальные для SomeClass экземпляры означают разные, по крайней мере, один из нескольких членов класса. Я решил использовать для этой цели std::set. Этот метод прототип, как следующее:

std::set<SomeClass> getAllUniqueInstances() const; 

В реализации этого метода я использую следующую конструкцию для заполнения std::set:

std::set<SomeClass> allUniqueInstances; 
for(auto it = std::begin(someArray_); it != std::end(someArray_); ++it){ 
    std::copy((*it).begin(), 
       (*it).end(), 
       std::inserter(allUniqueInstances, allUniqueInstances.end())); 
} 

operator<() определяется для SomeClass класса. В результате мой std::set заселен, но огромное количество экземпляров пропущено. Modyfing operator<() для SomeClass класс, изменяет ситуацию, но ломает желаемый порядок сортировки. Как в этом случае std::copy определяет, является ли значительный экземпляр уникальным?

UPD: исходный код для SomeClass

class SomeClass{ 
    private: 
     uint32_t from_; 
     uint32_t to_; 
     double capacity_; 
     double flow_; 
    public:   
     ... 
     bool operator<(const SomeClass& rhs) const; 
     ... 
    }; 

Я хочу SomeClass экземпляры, которые можно заказать в установленный from_ член:

bool SomeClass::operator<(const SomeClass& rhs) const{ 
    if(this->from_ < rhs.from_) 
     return true;  
    return false;  
} 
+2

Если вы должны были написать 'оператор ==' 'для SomeClass' что бы вы считаете атрибуты, необходимые ? Просто 'from_'? –

ответ

5

Это не std::copy, кто принимает решение о том случаи являются уникальными, но std::set. Логика-то вроде

(A < B ложно) и (B < А ложно)

Таким образом, критерий, который определяет порядок и определяет "уникальность". Похоже, что std::set - неправильная структура данных для этой проблемы, или ваши критерии упорядочения являются либо неправильными (как при невыполнении строгого слабого порядка), либо слишком широкими, чтобы удовлетворить эту проблему (например, вы заказываете на основе небольшого количества атрибутов когда вы можете использовать больше).

Вот пример лексикографического сравнения с использованием более атрибутов, чем вы в настоящее время имеют:

#include <tuple> // for std::tie 

bool SomeClass::operator<(const SomeClass& rhs) const 
{ 
    return std::tie(from_, to_, capacity_, flow_) < std::tie(rhs.from_, rhs.to_, rhs.capacity_, rhs.flow_); 
} 
+0

+1 Принуждение, которое может утомиться при использовании нескольких значений в 'operator <()', и я подозреваю, что это действительно проблема. – WhozCraig

+0

@WhozCraig, или это может быть так же тривиально, как и в самом деле много дубликатов для правильного упорядочения. – juanchopanza

+0

Фактически у меня есть ровно один дубликат для каждого уникального экземпляра – karven

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