gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:38:10 27 4
gpt4 key购买 nike

我有一个类,其中“数组的数组”私有(private)成员表示为:

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

这个类还有一个公共(public)方法,允许接收所有唯一的 SomeClass实例,包含在 someArray_ 中.独特的 SomeClass实例意味着几个类成员中的至少一个不同。我决定使用 std::set为了这个目的。该方法的原型(prototype)如下:

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 定义类(class)。结果我的 std::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;
}

最佳答案

决定实例是否唯一的不是std::copy,而是std::set。逻辑是这样的

(A < B is false) and (B < A is false)

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

关于C++ std::copy 从 std::deque 到 std::;set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18609005/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com