2

我有一个带有“数组数组”私有成员的类,表示为:

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类定义。结果 mystd::set被填充了,但是大量的实例被遗漏了。修改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;    
}
4

1 回答 1

5

不是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_);
}
于 2013-09-04T08:37:07.197 回答