【问题标题】:C++ std::copy from std::deque to std:;setC++ std::copy 从 std::deque 到 std:;set
【发布时间】:2013-09-04 08:33:08
【问题描述】:

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

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&lt;() 是为 SomeClass 类定义的。结果我的std::set 被填充了,但是大量的实例被遗漏了。 Modyfing operator&lt;() for SomeClass 类,改变了情况,但破坏了理想的排序顺序。在这种情况下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;    
}

【问题讨论】:

  • 如果您要为SomeClass 写一个operator==,您认为必要的属性是什么?只是from_ ?

标签: c++ stl set


【解决方案1】:

决定实例是否唯一的不是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_);
}

【讨论】:

  • +1 在 operator&lt;() 中使用多个值时强制执行可能会变得乏味,我怀疑这确实是这里的问题。
  • @WhozCraig 或者它可能是微不足道的,因为正确排序确实有很多重复。
  • 事实上,每个唯一实例我都有一个副本
  • @karven SomeClass 具有相同 from_ 值的实例是重复的。
  • @karven 完全正确。我添加了一个示例,使用 C++11 元组。
猜你喜欢
  • 2015-01-05
  • 2010-10-12
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 2015-01-15
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多