C++std::从std::deque复制到std:;设置



我有一个类的"array of array"私有成员表示为:

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

这个类还有一个公共方法,它允许接收包含在someArray_中的所有唯一的SomeClass实例。对于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()));
}

CCD_ 6是为CCD_ 7类定义的。结果,我的std::set被填充了,但遗漏了大量实例。为SomeClass类修改operator<(),改变了情况,但破坏了所需的排序顺序。在这种情况下,std::copy如何确定可观的实例是否唯一?

UPDSomeClass 的源代码

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;    
}

决定实例是否唯一的不是std::copy,而是std::set。逻辑有点像

(A<B为假)和(B<A为假)

因此,定义排序的标准也定义了"唯一性"。对于这个问题,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_);
}

最新更新