C ++ std :: copy从std :: deque到std :; set

时间:2013-09-04 08:33:09

标签: c++ stl set

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

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,但是错过了大量的实例。对operator<()课程进行Modyfing 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; } 个实例进行排序:

{{1}}

1 个答案:

答案 0 :(得分:5)

不是std::copy谁决定实例是唯一的,而是std::set。逻辑就像是

  

(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_);
}