我有一个带有“数组数组”私有成员的类,表示为:
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}}
答案 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_);
}