2

次のように表される「配列の配列」プライベートメンバーを持つクラスがあります。

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

SomeClassまた、このクラスには、に含まれるすべての一意のインスタンスを受け取ることができる public メソッドがありますsomeArray_。インスタンスに対して一意とSomeClassは、複数のクラス メンバーのうちの少なくとも 1 つが異なることを意味します。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データが取り込まれますが、大量のインスタンスが失われます。クラスのModyfingoperator<()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 に答える